реклама на сайте
подробности

 
 
6 страниц V  « < 2 3 4 5 6 >  
Reply to this topicStart new topic
> Оператор GoTo, безусловный переход или правила хорошего тона
DASM
сообщение Oct 24 2007, 06:45
Сообщение #46


Гуру
******

Группа: Свой
Сообщений: 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 в С++
Go to the top of the page
 
+Quote Post
alexander55
сообщение Oct 24 2007, 07:01
Сообщение #47


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(ValBag @ Oct 24 2007, 10:19) *

goto считаю атавизмом и С не использую, т.к. потребности никогда не возникает (а в Basic использовал).
Go to the top of the page
 
+Quote Post
IEC
сообщение Oct 24 2007, 07:07
Сообщение #48


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 22-03-05
Из: г. Харьков, Украина
Пользователь №: 3 598



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

А в бейсике без него сильно не поработаешь :-)
Прикрепленные файлы
Прикрепленный файл  Zamok_1.txt ( 4.44 килобайт ) Кол-во скачиваний: 99
 
Go to the top of the page
 
+Quote Post
dxp
сообщение Oct 24 2007, 07:19
Сообщение #49


Adept
******

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



Цитата(ValBag @ Oct 24 2007, 13:19) *
Во всех наставлениях по СИ для МК "...настоятельно не рекомендуется использовать оператор безусловного перехода goto, т.к. он затрудняет понимание программ и возможность их модификаций...". В то же время другими операторами СИ не всегда удобно осуществлять переходы, а в ассемблере применение команд jmp и rjmp ограничений почти нет.

Существует очень мало ситуаций, где этот оператор действительно необходим. В ~90% случаев это выход из вложенных циклов. Собсно, для этого оператор и оставили в языке. При всяком его применении нужно минимум дважды задуматься, действительно ли он тут необходим или задача может быть решена другими средствами. И уж злоупотребление (т.е. применение где ни попадя) им во всяком случае должно быть предотвращено.

P.S. Вообще-то, это вопрос для FAQ, его постоянно задают начинающие. smile.gif И частенко обсуждения достоинств и недостатков этого оператора приводят к "религиозным" войнам, по какой причине в некоторых местах (например, в фидо-эхе su.c-cpp) обсуждение оператора goto объявлено офтопиком и преследуется модератором по закону. smile.gif


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 24 2007, 07:19
Сообщение #50


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Продолжаем в уже существующей ветке:
http://electronix.ru/forum/index.php?showt...l=goto&st=0


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
andron86
сообщение Oct 24 2007, 07:23
Сообщение #51


Местный
***

Группа: Участник
Сообщений: 406
Регистрация: 1-03-06
Пользователь №: 14 821



Цитата(ValBag @ Oct 24 2007, 08:19) *
Для примера в программе "кодовый замок" из книги Белова А.В., в небольшом тексте программы на CИ в модуле main 7 переходов. И все работает нормально. Может быть, кто то потвердит вводное утверждение и покажет как надо на приложенном тексте.


Работать goto будет всегда, если правильно запрограммировал! Просто суть в том, что человеку будет труднее понять вашу функцию с 7 ohmy.gif goto, хотя и спорно. Мне, например труднее понять с do while.

Вообщее это дело вкуса.
Go to the top of the page
 
+Quote Post
alexander55
сообщение Oct 24 2007, 07:58
Сообщение #52


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(andron86 @ Oct 24 2007, 11:23) *
Работать goto будет всегда, если правильно запрограммировал!

Я бы не был таким оптимистом. М.б. при использовании другого компилятора, будет как раз неправильно с использованием goto. Или небольшое изменение с добавлением скобочек {}, подумайте и станет печально. Разве это хорошо ?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 24 2007, 08:07
Сообщение #53


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(alexander55 @ Oct 24 2007, 10:58) *
М.б. при использовании другого компилятора....

Вот так и рождаются предрассудки sad.gif. Сказал "может быть", помянул всуе "компилятор" и все понеслось...


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
alexander55
сообщение Oct 24 2007, 08:13
Сообщение #54


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(zltigo @ Oct 24 2007, 12:07) *
Вот так и рождаются предрассудки sad.gif. Сказал "может быть", помянул всуе "компилятор" и все понеслось...

Я замолкаю. Такие темы меня заводят. smile.gif
Go to the top of the page
 
+Quote Post
andron86
сообщение Oct 24 2007, 08:38
Сообщение #55


Местный
***

Группа: Участник
Сообщений: 406
Регистрация: 1-03-06
Пользователь №: 14 821



Цитата(alexander55 @ Oct 24 2007, 09:58) *
подумайте и станет печально.

Печального ничего не будет, если всё правильно сделали wink.gif
Go to the top of the page
 
+Quote Post
ValBag
сообщение Oct 24 2007, 09:49
Сообщение #56


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 15-03-07
Пользователь №: 26 183



Прошу прощения за создание новой темы без поиска.
Как заметил IEC и andron86 я начинал с ASM-а, поэтому c GoTo программа читается "влет", а труднее понять с do while и т.п.

DASM
Просьба еще раз просмотреть Ваш код и поправить неточности. Для меня это было бы хорошим наглядным пособием!
То, что мне непонятно:
1. Нет выхода из последнего вложенного цикла while(1).
2. Как мы попадаем в сегмент проверки кода?
3. В предпоследнем операторе while(1) первый оператор continue должен передать управление на следующую итерацию упомянутого while(1), но это неверно по сути того, что должна делать программа. Должен быть переход на первый оператор while(1).
Может быть я ошибаюсь. Просьба меня поправить.
Go to the top of the page
 
+Quote Post
Maddy
сообщение Oct 24 2007, 10:02
Сообщение #57


Участник
*

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



А собственно чего все так на бедного goto оплчились ? IMHO Даден инструмент в языке - надо - пользуйся , только думай что делаешьwink.gif Молотком тоже можно самого себя прибитьwink.gif но их-же никто не запрещает...
А ведь были еще setjmp/longjmp wink.gif про них вообще можно много интересного рассказать wink.gif и тож goto в каком-то смысле wink.gif

Сообщение отредактировал Maddy - Oct 24 2007, 10:02
Go to the top of the page
 
+Quote Post
aesok
сообщение Oct 24 2007, 10:04
Сообщение #58


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



GCC Bugzilla:

Only very good and very bad programmers use goto in C
Go to the top of the page
 
+Quote Post
DASM
сообщение Oct 24 2007, 10:19
Сообщение #59


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Не отношу себя ни к вери гуд ни вери бэд, но со временем согласен, все меньше следую умным книжкам и пользую то, что удобно.
ValBag - выходы там по break , но ошибки у меня есть точно, а голова после ночных посиделок не варит, попробуйте сами напрячься smile.gif
Go to the top of the page
 
+Quote Post
alexander55
сообщение Oct 24 2007, 10:21
Сообщение #60


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(aesok @ Oct 24 2007, 14:04) *
Only very good and very bad programmers use goto in C

Наверное, в этом все дело. a14.gif
Go to the top of the page
 
+Quote Post

6 страниц V  « < 2 3 4 5 6 >
Reply to this topicStart new topic
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 11:31
Рейтинг@Mail.ru


Страница сгенерированна за 0.01508 секунд с 7
ELECTRONIX ©2004-2016