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

плохой ли тон программирования развешивать флаги и их проверять?

вот, например,

...
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

 

итог, код рабочий. Но хороший ли тон так писать- через флаги.

Изменено пользователем Метценгерштейн

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


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

итог, код рабочий. Но хороший ли тон так писать- через флаги.

Хороший до тех пор пока не появляется 1024 флага в программе из 100 строк. :)

Кстати, про goto - это был пиар блочного кодирования, совсем не обязательно его игнорировать и кривиться, что мол читабельность программы снижается итд итп - это ведь все ложь.

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


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

Кстати, про goto - это был пиар блочного кодирования, совсем не обязательно его игнорировать и кривиться, что мол читабельность программы снижается итд итп - это ведь все ложь.

Скажем так - можно, но осторожно.

Чтобы лапши не накрутить.

 

Альтернатива флагам и поллингу - запуск callback-функций непосредственно в обработчике прерываний.

Что лучше, что хуже - это уже каждый решает индивидуально и в зависимости от.

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


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

Названия только таким переменным надо давать осмысленные. Мне, например пришлось прочитать весь фрагмент кода, чтоб понять, что flag должна называться newLineReceived.

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


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

хорошо, был ли вариант переписать данную задачу без флагов и тому подобное. Только с if или тому подобным?

Сами как решили бы подобную задачу? Тоже с флагами?

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


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

Сами как решили бы подобную задачу? Тоже с флагами?

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

 

А что касается подобного использования флага, так это просто вариант стейт-машины на два состояния. Никакого внутреннего отторжения не вызывает.

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


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

хорошо, был ли вариант переписать данную задачу без флагов и тому подобное. Только с if или тому подобным?

Сами как решили бы подобную задачу? Тоже с флагами?

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

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


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

т.е. конечные автоматы с

case swith?

 

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

 

эхо не хочу отключать- где- то оно надо- контролировать запросы хоть

Изменено пользователем Метценгерштейн

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


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

т.е.

case swith?

Это тут ни причем. :rolleyes:

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

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


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

Bill,

как же ни при чем?

 

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

 

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

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


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

Bill,

как же ни при чем?

 

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

 

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

Я же не конечный автомат имел в виду.

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


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

эхо не хочу отключать- где- то оно надо- контролировать запросы хоть

Напрасно. Тем более, что сейчас вы их просто игнорируете (полагая при этом что они есть), а не контролируете.

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


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

aaarrr

как в даташите эхо это называется правильно (мы про q2686 говорим, или в общем)? Пробежался сейчас- там только echo cancelation есть- но это для голоса. В каком разделе оно отключается?

Изменено пользователем Метценгерштейн

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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