|
|
  |
Инкрементирующийся define, c помощью препроцессор Си |
|
|
|
Jul 11 2016, 11:43
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (AlexandrY @ Jul 11 2016, 14:11)  Вы уж определитесь о чем хотите рассказать. Сначала у вас многоуровневые концепции, теперь опять рекурсивные. О том, что и написал в первом посте. Если количество состояний автомата начинает измеряться десятками и тем более сотнями, то конечный автомат пишется НЕПРАВИЛЬНО. Как с этим бороться - рецепты разные. В том числе и рекурсия в явном или неявном виде. QUOTE Я не видел рекурсию на в TCP/IP, ни в Zigbee, ни в BLE, ни в USB... Ну ни где. Вот я и говорю, что познания Ваши невелеки  . Есть целые пласты протоколов находящиеся далеко за пределами сознания бытовых компьютерщиков. Они, напрмер, живут здесь: https://en.wikipedia.org/wiki/ITU-T отличительная их особенность, что создавались и оттачивались они годами и десятилениями и служат не для того, что бы какая нибудь фирма могла быстро родить урода по собственному невеликому разумению и засрать рынок заставля конкурентов ковыряться в дерьме добиваясь совместмости и работоспособности. А совсем с противоположной целью. При этом типовой ITU-ный стиль описания протоколов это конечные автоматы. Так уж получилось, что большую часть своей жизни я занимался именно телекомуникационными протоколами. Отчего и образовался более, чем скептический взгляд на то, что рожают и изобилии околокомпьютерщики и что является, как например, TCP/IP в лучшем случае огрызком давно существующих стеков протоколов.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 11 2016, 13:24
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Kabdim @ Jul 11 2016, 15:10)  Не могли бы Вы, zltigo, уточнить в каком именно протоколе ITU-T рекурсивный разбор полей? Как ТРЕБОВАНИЕ реализовывать что либо рекурсивно - естественно, в описании протоколов этого нет. Описание протроколов никак не описывает способов их реализации, хотя на верхнем уровне протокол описывается как конечный автомат и соответственно подталкивает на этот путь. В конкретной реализации протокола все уже на откуп того, кто реализовывет. Я использовал рекурсивные вызовы автомата уже на уровне MTP3. Цитата(AlexandrY @ Jul 11 2016, 16:07)  Он наверно имеет в виду DHCP где минимум 71 case в реализации. С каких пор студенческий самодуй DHСP стал иметь отношение к ITU? Разномастные огрызки разных RFC это вообще не стандарт. Цитата Протоколы ITU-T из-за их всеядности и резиновости просто кошмарное количество switch-case требуют. ITU-T протоколы не требуют "кошмарных" количеств "case". По причине того, что они изначально разделены и хорошо суктурированы по уровням. Если же практическую реализацию делать бездумно смешивая в одну кучу что попало, то тогда, конечно, количество состояний для обеспечия функционирования можно раздувать хоть до "71" хоть до тысяч. DHCP с 71 case, это как раз пример безмозглого подхода к делу  в стиле давай-давай, что тут думать трясти надо. Это обычно для "компьютерщиков", которые недоучившись и недопоняв сначала сотворив огрызок TCP/IP из того, что смогли понять в X.25 стеке, начали городить бездумно городить "протоколы" и дальше. В результате начальное "упрощение", выкидывание, объедиение и усечение уровней ведет при попытке реализовать что либо сложнее, чем "два байта переслать" к каше из уровней, множества заплаток и появлениям "DHCP где минимум 71 case". Я все понимаю, почему так все растет - бурно в 70x началась компьютеоизация и микроконтролизация. Все сделать сразу по уму и аккуратно было сложно, или воообще почти невозможно из-за отсутсвия те-же аппаратных ресурсов. Мозговых ресурсов тоже не хватало - хлынул поток студентов нахватавшихся только вершков. Все понятно. И то, что выросло, то выросло http://inet777.ru/esli-byi-stroiteli-stroi...vilizaciyu/8476
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 11 2016, 13:40
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
Задавал я аналогичный вопрос тутно реализация через boost меня ужаснула. Вместо С-препроцессора проще сделать свой для pre-build. Так и сделал. Так и доволен сделаным.
|
|
|
|
|
Jul 12 2016, 08:26
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Цитата(MrYuran @ Jul 12 2016, 10:06)  А я таки не понял, чем enum плох? Мало того, что все по порядку, так можно добавить последний элемент eNumOfItems и получить автоматически количество элементов, которое можно вставить в определения массивов или в циклы, etc. Правильное тактическое применение enum это когда назначаешь переменной символьное имя и проверяешь всегда у нее только символьное имя. А если надо enum сравнивать с int то это уже неправильное применение enum. О чем отладчики и намекают не показывая числовое значение переменной с типом enum. Цитата(zltigo @ Jul 11 2016, 16:24)  Все сделать сразу по уму и аккуратно было сложно, или воообще почти невозможно из-за отсутсвия те-же аппаратных ресурсов. Мозговых ресурсов тоже не хватало - хлынул поток студентов нахватавшихся только вершков. Все понятно. Это заблуждение разработчика видимо давно не имевшего практику разработки современных приложений. Нынче длинные switch-case редко встретишь потому что протоколы разрослись настолько, что им этот механизм стал мал. Строят целы базы данных в виде таблиц с сотнями и тысячами записей. Для такого switch-case просто физически писать уже невмоготу, потому при разборе протоколов переходят на движки с поиском по базе данных. Взгляните на ATT в BLE Это ухудшает конечно производительность, но и процессоры стали быстрее.
|
|
|
|
|
Jul 12 2016, 09:47
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (AlexandrY @ Jul 12 2016, 11:26)  Это заблуждение разработчика видимо давно не имевшего практику разработки современных приложений. Это ЗНАНИЕ разработчика, который ЗНАЕТ, что если разрабатывать и писать реализации через анус, то case разрастаются немеряно. Что свидетельвует о НЕПРАВИЛЬНОМ подходе к реализации. О чем сразу в первом посте и написал. О том, что "современные" приложения рожают через анус, потому, что и ума и времени нехватает, тоже писал. QUOTE ...писать уже невмоготу, потому при разборе протоколов переходят на движки с поиском по базе данных. Теперь, если вернуться к TC и case, то очень, очень полагаю, что ничего сколь-нибудь выдающищегося и затмевающего своей сложностью "ATT в BLE" и иже с ним он не пишет, а просто и банально из-за необдуманости реализации тонет в плодящихся состояних конечного автомата  .
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 13 2016, 05:15
|
Местный
  
Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041

|
Я бы так делать не стал, но все же... CODE switch (i) { #define INC_DEF 0 #define TMP_DEF INC_DEF+1 case INC_DEF: ... break;
#undef INC_DEF #define INC_DEF TMP_DEF #undef TMP_DEF #define TMP_DEF INC_DEF+1
case INC_DEF: ... break;
#undef INC_DEF #define INC_DEF TMP_DEF #undef TMP_DEF #define TMP_DEF INC_DEF+1 case INC_DEF: ... break;
#undef INC_DEF #define INC_DEF TMP_DEF #undef TMP_DEF #define TMP_DEF INC_DEF+1
case INC_DEF: ... break;
... }
|
|
|
|
|
Jul 13 2016, 06:36
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
Если надо что-то "проинкриментировать" - надо сгенерировать некую таблицу (массив const структур во флеш), или несколько таблиц с требуемой инф-ей. Опятьже - сделать свой препроцессор. ОНО будет читабельнее, логичнее без идиотизма когда средство важнее цели. Если конечно цель - не сделать "глухой" проект, в котором только писатель и разбирается. Цитата(Dog Pawlowa @ Jul 12 2016, 17:57)  Вообще то сам по себе инкремент состояния - это потенциальная угроза ошибки. Сейчас ручками вписываю конкретное текстовое состояние перехода (из enum, или enum+X-macro). Вот я по Вашей наводке так и делаю. Гранд мерси  enum - генерация последовательных индексов массива, и ониже - для инициализации массива констант-структур. (реализация сколько-угодно-уровневого меню).
Сообщение отредактировал k155la3 - Jul 13 2016, 06:55
|
|
|
|
|
Jul 14 2016, 05:55
|
Группа: Участник
Сообщений: 7
Регистрация: 27-05-05
Пользователь №: 5 449

|
Я использую таблицу состояний автомата именно в виде таблицы во флеш, а парсер этой таблицы ее просто сканирует и выполняет действия в соответствии "состояние-событие-выполнить действие-перейти в новое состояние". В этом случае вся логика автомата содержится в таблице и любое добавление, удаление или редактирование любой строки влияет только на действия именно этой строки.
|
|
|
|
|
Jul 14 2016, 09:04
|
Группа: Участник
Сообщений: 7
Регистрация: 27-05-05
Пользователь №: 5 449

|
Цитата(adnega @ Jul 14 2016, 12:53)  А кто придумывает номера для "состояний"? При добавлении новой записи нужно править поле "перейти в новое состояние" предыдущей записи? Или можно ставить только поля "событие" и "выполнить действие" а выполняться все будет линейно пока не дойдет до конца таблицы? Еще один enum Если при правке выясняется, что нужно перейти в другое состояние, то да, нужно исправлять. Если планируется, что все будет выполняться линейно, то это проще прописать в парсере один раз, тогда поле "перейти в состояние" в таблице отмирает.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|