Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: плохой ли тон программирования развешивать флаги и их проверять?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Метценгерштейн
вот, например,
Код
...
static uint8_t flag = 0;
...
if ( hasinput () )
     {
       data [num] = getchar();
      
       if (flag)
       {
         if( data [num] == 0x0A)
             {
              data [num - 1] = 0x00;
              num = 0;
              flag = 0;
             }
            else      
               num++;  
       }
      
       if( data [num] == 0x0A)
       {
         data [num] = 0;
         flag = 1;
       }
      
     }


Задача стояла такая:
модем на запрос АТ команды выдает ответ. Сначала пишет саму команду, потом ответ. В ASCII это выглядит так:


41 54 2B 43 50 42 53 3D 3F 0D 0D 0A 45 52 52 4F 52 0D 0A 00
A T + C P B S = ? CR CR LF E R R O R CR LF

Моя задача была сложить в массив data[] все после символа 0x0A, т.е. ERROR

итог, код рабочий. Но хороший ли тон так писать- через флаги.
_Pasha
Цитата(Метценгерштейн @ Jan 25 2011, 17:23) *
итог, код рабочий. Но хороший ли тон так писать- через флаги.

Хороший до тех пор пока не появляется 1024 флага в программе из 100 строк. sm.gif
Кстати, про goto - это был пиар блочного кодирования, совсем не обязательно его игнорировать и кривиться, что мол читабельность программы снижается итд итп - это ведь все ложь.
MrYuran
Цитата(_Pasha @ Jan 25 2011, 17:48) *
Кстати, про goto - это был пиар блочного кодирования, совсем не обязательно его игнорировать и кривиться, что мол читабельность программы снижается итд итп - это ведь все ложь.

Скажем так - можно, но осторожно.
Чтобы лапши не накрутить.

Альтернатива флагам и поллингу - запуск callback-функций непосредственно в обработчике прерываний.
Что лучше, что хуже - это уже каждый решает индивидуально и в зависимости от.
neiver
Названия только таким переменным надо давать осмысленные. Мне, например пришлось прочитать весь фрагмент кода, чтоб понять, что flag должна называться newLineReceived.
aaarrr
Можно использовать и флаги и goto. Насчет названия, пожалуй, соглашусь.
Метценгерштейн
хорошо, был ли вариант переписать данную задачу без флагов и тому подобное. Только с if или тому подобным?
Сами как решили бы подобную задачу? Тоже с флагами?
rezident
Цитата(Метценгерштейн @ Jan 25 2011, 22:55) *
Сами как решили бы подобную задачу?
Методом конечных автоматов.
aaarrr
Цитата(Метценгерштейн @ Jan 25 2011, 20:55) *
Сами как решили бы подобную задачу? Тоже с флагами?

Я бы первым делом отключил эхо. И точно не "сливал" бы приходящие от модема ответы - их парсить надо внимательно, а не полагаться на авось.

А что касается подобного использования флага, так это просто вариант стейт-машины на два состояния. Никакого внутреннего отторжения не вызывает.
_Bill
Цитата(Метценгерштейн @ Jan 25 2011, 21:55) *
хорошо, был ли вариант переписать данную задачу без флагов и тому подобное. Только с if или тому подобным?
Сами как решили бы подобную задачу? Тоже с флагами?

Я бы заполнил сначала весь буфер, а потом бы воспользовался функцией strchr.
Метценгерштейн
т.е. конечные автоматы с
case swith?

strchr изучу, спасибо.

эхо не хочу отключать- где- то оно надо- контролировать запросы хоть
_Bill
Цитата(Метценгерштейн @ Jan 25 2011, 22:12) *
т.е.
case swith?

Это тут ни причем. rolleyes.gif
Метценгерштейн
Bill,
как же ни при чем?

Классический конечный автомат

Код
switch(State) {
         case Statement1:
             // этот код выполняется если Statement1
             .......
             break;
         case Statement2:
             // этот код выполняется если Statement2
             .......
             break;
        }
_Bill
Цитата(Метценгерштейн @ Jan 25 2011, 22:19) *
Bill,
как же ни при чем?

Классический конечный автомат

Код
switch(State) {
         case Statement1:
             // этот код выполняется если Statement1
             .......
             break;
         case Statement2:
             // этот код выполняется если Statement2
             .......
             break;
        }

Я же не конечный автомат имел в виду.
aaarrr
Цитата(Метценгерштейн @ Jan 25 2011, 21:12) *
эхо не хочу отключать- где- то оно надо- контролировать запросы хоть

Напрасно. Тем более, что сейчас вы их просто игнорируете (полагая при этом что они есть), а не контролируете.
Метценгерштейн
aaarrr
как в даташите эхо это называется правильно (мы про q2686 говорим, или в общем)? Пробежался сейчас- там только echo cancelation есть- но это для голоса. В каком разделе оно отключается?
firstvald
Хотел написать , но резидент опередил , очень много задачь рашается автоматами. Причем каждый сам для себя определяет, как он пишет. И вырабатывает приемы. Ваш флажек - это просто автомат с 2 состояниями. На мой взгляд использование case, не самый лучший стиль. Есть подводные камни. Лучше все же if - вы больше владеете ситуацией, причем, на самом деле, все, в конце концов, транслируется в одинаковый код.
aaarrr
Цитата(Метценгерштейн @ Jan 25 2011, 21:29) *
как в даташите эхо это называется правильно (мы про q2686 говорим, или в общем)?

Q2686 был сейчас упомянут впервые. А если вообще, то ATE0.
Метценгерштейн
firstvald спасибо. я правильно понимаю применение автомата- я его правильно привел? Что в нем Билл не то нашел?

aaarrr да, спасибо, найду поиском эту команду, посмотрю подробнее.

ну и, кстати, распарсить ф-ей strchr тоже идея хорошая.
HARMHARM
Цитата(Метценгерштейн @ Jan 25 2011, 20:40) *
ну и, кстати, распарсить ф-ей strchr тоже идея хорошая.

Не забудьте, что все функции str* ожидают увидеть в конце строки 0. Иначе будут долго ходить по памяти. Можно в линейном буфере закончить нулем последовательность, если, конечно, буфер не заполнен.
_Bill
Цитата(Метценгерштейн @ Jan 25 2011, 22:40) *
firstvald спасибо. я правильно понимаю применение автомата- я его правильно привел? Что в нем Билл не то нашел?

ну и, кстати, распарсить ф-ей strchr тоже идея хорошая.

Я против автомата ничего не имею. Он действительно реализуется с помощью оператора switch.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.