Перейти к содержанию
    

добрый день.
разбираю код (обычный си-код, без крестов):

1. switch вложен в for
2. выброс реализован "хаком" условия for

все работает, но при "обычном" многостраничном операторе switch-case такой выход "неочевиден".

вопрос: можно-ли как ни-будь красиво/очевидно/локонично реализовать выход из цикла

for(i=1; i<RET; i++)
{
...
switch(i)
  {
  case 10:
  if()
    {
    ...
    RET = 11; // break to out
    }
  break;
  ...
  case 20:
  if()
    {
    ...
    RET = 21;
    }
  break;
  ...
  case 30:
  if()
    {
    ...
    RET = 31;
    }
  break;
  }   // switch()
}     // for()

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

23 minutes ago, sunjob said:

вопрос: можно-ли как ни-будь красиво/очевидно/локонично реализовать выход из цикла

Именно для таких целей и нужен goto. Не надо его бояться ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, sunjob сказал:

добрый день.
разбираю код (обычный си-код, без крестов):

1. switch вложен в for
2. выброс реализован "хаком" условия for

все работает, но при "обычном" многостраничном операторе switch-case такой выход "неочевиден".

вопрос: можно-ли как ни-будь красиво/очевидно/локонично реализовать выход из цикла

Не понятно - на кой в каждой точке выхода RET присваиваются разные значения? Разумнее RET=0 везде. Тогда и компилятор все их объединит, направив все переходы в один адрес.

Другой вариант: заменить все места где сейчас break, на continue, а везде где RET=... поставить break и break в конце for().

for (i = 1; i < RET; i++) {
  ...
  switch (i) {
    case 10:
      if (!(...)) continue;
      ...
      break;
    case 20:
      if (!(...)) continue;
      ...
      break;
      ...      
    default: continue;
  }
  break;
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

нафих-нафих, никаких гоутушек нам и даром не надоть :о)

если RET переименовать  в BREAK ... все становится очевидным, без лишних сущностей :о)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Rst7 сказал:

Именно для таких целей и нужен goto. Не надо его бояться ;)

Я тоже его никогда не использую. Так как с goto код становится ещё более трудночитаемым.

Слышали термин "вермишельная логика"? Вот тем оно и становится.  :wacko:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, jcxz said:

на кой в каждой точке выхода RET присваиваются разные значения?

спросите того, кто это написал :о)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, sunjob сказал:

спросите того, кто это написал :о)

Так и переименуйте!

#define EXIT_FROM_FOR() (RET = 0)
...
#undef EXIT_FROM_FOR

:wink:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

jcxz

ваш коде (который первый) очевиден для "написания", но не очевиден для "начитания" :о) когда код раздутый с трехэтажным матом, на несколько страниц

я самым оптимальным нашел переименвание в BREAK , или точнее, BREAK=0 :o)

 

спасибо

Изменено пользователем sunjob

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 minutes ago, jcxz said:

Я тоже его никогда не использую. Так как с goto код становится ещё более трудночитаемым.

А с вот этими чудо-костылями он более читаемый? И следующий вопросс - повезет ли Вам с оптимизацией, что это действительно превратится в коде в одну команду перехода, а не в насилие над переменными?   

10 minutes ago, jcxz said:

Слышали термин "вермишельная логика"? Вот тем оно и становится.  :wacko:

Просто метки надо называть не aaaa, а вменяемо ;)

И раз уж пошел такой разговор, то насилие над счетчиком цикла в нескольких местах - это моветон похуже goto.

Ну да ладно, срач про goto - он вечен :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

используфте наздоровье ваш goto где вам удобно :feminist:

Quote

насилие над счетчиком цикла в нескольких местах

никакого насилия нет, все уже давно отрихтовано ... (написано же в начале, что разбираюсь с чужим кодом! а писать свой с нуля и разбираться/рихтовать чужой код это не один и тот-же чукча)

Изменено пользователем sunjob

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, sunjob said:

никакого насилия нет, все уже давно отрихтовано ...

В смысле нет? Вы изменяете переменную цикла в нескольких местах. В самом заголовке for (нормальное место) и в ветках switch. С точки зрения академичской науки (именно той, которая против goto) - это тоже смертный грех.

Или у Вас, как щас принято, "вы не понимаете, это другое!!!!!!!"? :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

38 минут назад, Rst7 сказал:

А с вот этими чудо-костылями он более читаемый?

Именно так. У меня все операторы разбиты отступами по уровням вложенности. И поэтому легко найти точки выхода и блоков (switch, for, ...). Когда я вижу break - отматываю на хорошо видимый конец блока, continue - на начало.

А goto ломает всю эту систему и становится нечитаемым большой и сложный код, со многими уровнями вложенности.

Цитата

И следующий вопросс - повезет ли Вам с оптимизацией, что это действительно превратится в коде в одну команду перехода, а не в насилие над переменными?   

Я имею привычку смотреть в листинги регулярно:wink:  Поэтому и знаю, что не "повезёт/не_повезёт", а так и оно и будет.

Скорей всего будут просто переходы из всех точек (RET=...) в одну, где будет одно присваивание; или же вообще без присваивания - сразу переход за пределы цикла (если за пределами цикла переменная RET не используется).

Цитата

Просто метки надо называть не aaaa, а вменяемо ;)

Дело не в названии меток. А в том, что они рушат форматирование текста. А текст должен быть форматированным. Чтобы был читаемым.

Цитата

И раз уж пошел такой разговор, то насилие над счетчиком цикла в нескольких местах - это моветон похуже goto.

Оптимизирующий компилятор скорее всего вообще эти присваивания (RET=...) выкинет и сразу направит команду перехода за пределы цикла (если за пределами цикла переменная RET не используется).

11 минут назад, Rst7 сказал:

В смысле нет? Вы изменяете переменную цикла в нескольких местах.

Приглядитесь внимательнее. Там не "переменная цикла" меняется внутри.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, jcxz said:

У меня все операторы разбиты отступами по уровням вложенности.

Так в чем проблема? Метка будет на -1 уровне, хорошо заметна и читаема:

int func(void)
{
    int res = 0;
  
    for()
    {
       switch()
       {
       }
    }
exit:
    return res;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 minutes ago, jcxz said:

Приглядитесь внимательнее. Там не "переменная цикла" меняется внутри.

Согласен, недоглядел. Применен другой способ прострелить себе ногу, куда более изощренный :biggrin:

3 minutes ago, aaarrr said:

Метка будет на -1 уровне, хорошо заметна и читаема:

"Вы не понимаете, это другое" (С)

:biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, aaarrr сказал:

Так в чем проблема? Метка будет на -1 уровне, хорошо заметна и читаема:


int func(void)
{
    int res = 0;
  
    for()
    {
       switch()
       {
       }
    }
exit:
    return res;
}

Это похоже на рюкзак: всё упаковано, уложено как надо. ...Но один гвоздь торчит в сторону и колет спину.  :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...