Метценгерштейн 0 25 января, 2011 Опубликовано 25 января, 2011 (изменено) · Жалоба вот, например, ... 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 итог, код рабочий. Но хороший ли тон так писать- через флаги. Изменено 25 января, 2011 пользователем Метценгерштейн Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 25 января, 2011 Опубликовано 25 января, 2011 · Жалоба итог, код рабочий. Но хороший ли тон так писать- через флаги. Хороший до тех пор пока не появляется 1024 флага в программе из 100 строк. :) Кстати, про goto - это был пиар блочного кодирования, совсем не обязательно его игнорировать и кривиться, что мол читабельность программы снижается итд итп - это ведь все ложь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 19 25 января, 2011 Опубликовано 25 января, 2011 · Жалоба Кстати, про goto - это был пиар блочного кодирования, совсем не обязательно его игнорировать и кривиться, что мол читабельность программы снижается итд итп - это ведь все ложь. Скажем так - можно, но осторожно. Чтобы лапши не накрутить. Альтернатива флагам и поллингу - запуск callback-функций непосредственно в обработчике прерываний. Что лучше, что хуже - это уже каждый решает индивидуально и в зависимости от. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
neiver 0 25 января, 2011 Опубликовано 25 января, 2011 · Жалоба Названия только таким переменным надо давать осмысленные. Мне, например пришлось прочитать весь фрагмент кода, чтоб понять, что flag должна называться newLineReceived. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 25 января, 2011 Опубликовано 25 января, 2011 · Жалоба Можно использовать и флаги и goto. Насчет названия, пожалуй, соглашусь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 25 января, 2011 Опубликовано 25 января, 2011 · Жалоба хорошо, был ли вариант переписать данную задачу без флагов и тому подобное. Только с if или тому подобным? Сами как решили бы подобную задачу? Тоже с флагами? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 25 января, 2011 Опубликовано 25 января, 2011 · Жалоба Сами как решили бы подобную задачу?Методом конечных автоматов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 25 января, 2011 Опубликовано 25 января, 2011 · Жалоба Сами как решили бы подобную задачу? Тоже с флагами? Я бы первым делом отключил эхо. И точно не "сливал" бы приходящие от модема ответы - их парсить надо внимательно, а не полагаться на авось. А что касается подобного использования флага, так это просто вариант стейт-машины на два состояния. Никакого внутреннего отторжения не вызывает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bill 0 25 января, 2011 Опубликовано 25 января, 2011 · Жалоба хорошо, был ли вариант переписать данную задачу без флагов и тому подобное. Только с if или тому подобным? Сами как решили бы подобную задачу? Тоже с флагами? Я бы заполнил сначала весь буфер, а потом бы воспользовался функцией strchr. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 25 января, 2011 Опубликовано 25 января, 2011 (изменено) · Жалоба т.е. конечные автоматы с case swith? strchr изучу, спасибо. эхо не хочу отключать- где- то оно надо- контролировать запросы хоть Изменено 25 января, 2011 пользователем Метценгерштейн Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bill 0 25 января, 2011 Опубликовано 25 января, 2011 (изменено) · Жалоба т.е. case swith? Это тут ни причем. :rolleyes: Изменено 25 января, 2011 пользователем _Bill Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 25 января, 2011 Опубликовано 25 января, 2011 · Жалоба Bill, как же ни при чем? Классический конечный автомат switch(State) { case Statement1: // этот код выполняется если Statement1 ....... break; case Statement2: // этот код выполняется если Statement2 ....... break; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bill 0 25 января, 2011 Опубликовано 25 января, 2011 · Жалоба Bill, как же ни при чем? Классический конечный автомат switch(State) { case Statement1: // этот код выполняется если Statement1 ....... break; case Statement2: // этот код выполняется если Statement2 ....... break; } Я же не конечный автомат имел в виду. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 25 января, 2011 Опубликовано 25 января, 2011 · Жалоба эхо не хочу отключать- где- то оно надо- контролировать запросы хоть Напрасно. Тем более, что сейчас вы их просто игнорируете (полагая при этом что они есть), а не контролируете. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 25 января, 2011 Опубликовано 25 января, 2011 (изменено) · Жалоба aaarrr как в даташите эхо это называется правильно (мы про q2686 говорим, или в общем)? Пробежался сейчас- там только echo cancelation есть- но это для голоса. В каком разделе оно отключается? Изменено 25 января, 2011 пользователем Метценгерштейн Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться