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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> плохой ли тон программирования развешивать флаги и их проверять?, Про goto четко сказано- лучше не использовать. Или флаги- это хардкод?
Метценгерштейн
сообщение Jan 25 2011, 14:23
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



вот, например,
Код
...
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

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

Сообщение отредактировал Метценгерштейн - Jan 25 2011, 14:25
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 25 2011, 14:48
Сообщение #2


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



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

Хороший до тех пор пока не появляется 1024 флага в программе из 100 строк. sm.gif
Кстати, про goto - это был пиар блочного кодирования, совсем не обязательно его игнорировать и кривиться, что мол читабельность программы снижается итд итп - это ведь все ложь.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jan 25 2011, 15:13
Сообщение #3


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



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

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

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


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
neiver
сообщение Jan 25 2011, 15:40
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123



Названия только таким переменным надо давать осмысленные. Мне, например пришлось прочитать весь фрагмент кода, чтоб понять, что flag должна называться newLineReceived.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 25 2011, 15:44
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Можно использовать и флаги и goto. Насчет названия, пожалуй, соглашусь.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jan 25 2011, 17:55
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



хорошо, был ли вариант переписать данную задачу без флагов и тому подобное. Только с if или тому подобным?
Сами как решили бы подобную задачу? Тоже с флагами?
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 25 2011, 18:09
Сообщение #7


Гуру
******

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



Цитата(Метценгерштейн @ Jan 25 2011, 22:55) *
Сами как решили бы подобную задачу?
Методом конечных автоматов.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 25 2011, 18:11
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Метценгерштейн @ Jan 25 2011, 20:55) *
Сами как решили бы подобную задачу? Тоже с флагами?

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

А что касается подобного использования флага, так это просто вариант стейт-машины на два состояния. Никакого внутреннего отторжения не вызывает.
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jan 25 2011, 18:12
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



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

Я бы заполнил сначала весь буфер, а потом бы воспользовался функцией strchr.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jan 25 2011, 18:12
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



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

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

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

Сообщение отредактировал Метценгерштейн - Jan 25 2011, 18:15
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jan 25 2011, 18:14
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(Метценгерштейн @ Jan 25 2011, 22:12) *
т.е.
case swith?

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

Сообщение отредактировал _Bill - Jan 25 2011, 18:15
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jan 25 2011, 18:19
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



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

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

Код
switch(State) {
         case Statement1:
             // этот код выполняется если Statement1
             .......
             break;
         case Statement2:
             // этот код выполняется если Statement2
             .......
             break;
        }
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jan 25 2011, 18:23
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(Метценгерштейн @ Jan 25 2011, 22:19) *
Bill,
как же ни при чем?

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

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

Я же не конечный автомат имел в виду.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 25 2011, 18:27
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

Напрасно. Тем более, что сейчас вы их просто игнорируете (полагая при этом что они есть), а не контролируете.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jan 25 2011, 18:29
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



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

Сообщение отредактировал Метценгерштейн - Jan 25 2011, 18:30
Go to the top of the page
 
+Quote Post

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

 


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


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