|
|
  |
Оператор GoTo, безусловный переход или правила хорошего тона |
|
|
|
Oct 24 2007, 06:45
|
Гуру
     
Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493

|
Чисто в лоб типа такого Код while (1) {
do {
while (incod() != klfree); // Ожидание отпускания кнопок while (incod() == klfree); // Ожидание нажатия кнопок ii=0; do { #asm("cli"); // Запрещаем прерывания wait(1); // Задержка 1-го типа codS=incod(); // Ввод кода и запись, как старого bufr[ii++]=codS; // Запись очередного кода в буфер if (ii>=bsize) break; // Проверка конца буфера wait(2); // Задержка 2-го типа do { if (incod() != codS) break; // Проверка не изменилось ли состояние
} while((flz==0)); // Проверка окончания контрольного промежутка времени } while(1);
if (PINB.7==1) { if (klen!=ii) continue; // Проверка длины кода } //------------------------------ Запись кода в EEPROM klen=ii; // Запись длины кода for (i=0; i<ii; i++) bufe[i]=bufr[i]; // Запись всех байтов кода break;
//------------------------------ Проверка кода if (klen!=ii) continue; // Проверка длины кода for (i=0; i<ii; i++) if (bufe[i]!=bufr[i]) continue; // Проверка самого кода break; //------------------------------ Открывание замка } while(1); PORTB.4=1; // Открываем замок wait(3); // Задержка 3-го типа PORTB.4=0; // Закрываем замок }; Может есть ошибки, да и упростить можно, но суть та же goto нафик не нужен При чем тут AVR кстати ? Цитата(ValBag @ Oct 24 2007, 10:19)  В то же время другими операторами СИ не всегда удобно осуществлять переходы Кто такое сказал, автор или Вы? goto реально упрощает обработку чего-то экстраординарного, но для этого лучше применть блоки try catch в С++
|
|
|
|
|
Oct 24 2007, 07:07
|
Местный
  
Группа: Свой
Сообщений: 263
Регистрация: 22-03-05
Из: г. Харьков, Украина
Пользователь №: 3 598

|
Ну результат почти такой же. В текущем примере из-за goto тяжело понять логику, поэтому пришлось импровизировать. Пример можно еще оптимизировать. А вообще-то стиль написания напомнил asm. Видимо человек до этого долго писал на нем, отсюда логика построения функции. А в бейсике без него сильно не поработаешь :-)
|
|
|
|
|
Oct 24 2007, 07:19
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(ValBag @ Oct 24 2007, 13:19)  Во всех наставлениях по СИ для МК "...настоятельно не рекомендуется использовать оператор безусловного перехода goto, т.к. он затрудняет понимание программ и возможность их модификаций...". В то же время другими операторами СИ не всегда удобно осуществлять переходы, а в ассемблере применение команд jmp и rjmp ограничений почти нет. Существует очень мало ситуаций, где этот оператор действительно необходим. В ~90% случаев это выход из вложенных циклов. Собсно, для этого оператор и оставили в языке. При всяком его применении нужно минимум дважды задуматься, действительно ли он тут необходим или задача может быть решена другими средствами. И уж злоупотребление (т.е. применение где ни попадя) им во всяком случае должно быть предотвращено. P.S. Вообще-то, это вопрос для FAQ, его постоянно задают начинающие.  И частенко обсуждения достоинств и недостатков этого оператора приводят к "религиозным" войнам, по какой причине в некоторых местах (например, в фидо-эхе su.c-cpp) обсуждение оператора goto объявлено офтопиком и преследуется модератором по закону.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Oct 24 2007, 07:23
|
Местный
  
Группа: Участник
Сообщений: 406
Регистрация: 1-03-06
Пользователь №: 14 821

|
Цитата(ValBag @ Oct 24 2007, 08:19)  Для примера в программе "кодовый замок" из книги Белова А.В., в небольшом тексте программы на CИ в модуле main 7 переходов. И все работает нормально. Может быть, кто то потвердит вводное утверждение и покажет как надо на приложенном тексте. Работать goto будет всегда, если правильно запрограммировал! Просто суть в том, что человеку будет труднее понять вашу функцию с 7  goto, хотя и спорно. Мне, например труднее понять с do while. Вообщее это дело вкуса.
|
|
|
|
|
Oct 24 2007, 10:02
|
Участник

Группа: Validating
Сообщений: 56
Регистрация: 15-10-06
Пользователь №: 21 335

|
А собственно чего все так на бедного goto оплчились ? IMHO Даден инструмент в языке - надо - пользуйся , только думай что делаешь  Молотком тоже можно самого себя прибить  но их-же никто не запрещает... А ведь были еще setjmp/longjmp  про них вообще можно много интересного рассказать  и тож goto в каком-то смысле
Сообщение отредактировал Maddy - Oct 24 2007, 10:02
|
|
|
|
|
  |
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|
|