Метценгерштейн
Jan 25 2011, 14:23
вот, например,
Код
...
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, 14:48
Цитата(Метценгерштейн @ Jan 25 2011, 17:23)

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

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

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

Сами как решили бы подобную задачу?
Методом конечных автоматов.
aaarrr
Jan 25 2011, 18:11
Цитата(Метценгерштейн @ Jan 25 2011, 20:55)

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

хорошо, был ли вариант переписать данную задачу без флагов и тому подобное. Только с if или тому подобным?
Сами как решили бы подобную задачу? Тоже с флагами?
Я бы заполнил сначала весь буфер, а потом бы воспользовался функцией strchr.
Метценгерштейн
Jan 25 2011, 18:12
т.е. конечные автоматы с
case swith?
strchr изучу, спасибо.
эхо не хочу отключать- где- то оно надо- контролировать запросы хоть
Цитата(Метценгерштейн @ Jan 25 2011, 22:12)

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

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

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

как в даташите эхо это называется правильно (мы про q2686 говорим, или в общем)?
Q2686 был сейчас упомянут впервые. А если вообще, то ATE0.
Метценгерштейн
Jan 25 2011, 18:40
firstvald спасибо. я правильно понимаю применение автомата- я его правильно привел? Что в нем Билл не то нашел?
aaarrr да, спасибо, найду поиском эту команду, посмотрю подробнее.
ну и, кстати, распарсить ф-ей strchr тоже идея хорошая.
HARMHARM
Jan 26 2011, 00:04
Цитата(Метценгерштейн @ Jan 25 2011, 20:40)

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

firstvald спасибо. я правильно понимаю применение автомата- я его правильно привел? Что в нем Билл не то нашел?
ну и, кстати, распарсить ф-ей strchr тоже идея хорошая.
Я против автомата ничего не имею. Он действительно реализуется с помощью оператора switch.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.