|
Инкрементирующийся define, c помощью препроцессор Си |
|
|
|
Jul 10 2016, 06:40
|
Профессионал
    
Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256

|
Здравствуйте. Написан конечный автомат на конструкции switch - case. Для перехода к последующему действию просто инкрементируется указатель: Код switch(i) { case 0: ... i++; case 1: ... i++; ... case N: ... i++; } Действий порядка 100 и возникла проблема с добавлением новых case-обработчиков в середину конструкции, т.к. приходится увеличивать все последующие номера case. Хочется перенести эту задачу на плечи препроцессора и оформить конструкцию таким образом, чтобы название макроопределения case было у всех одинаковым и, в тоже время, каждое последующее значение было на 1 больше предыдущего: Код switch(i) { case INCNAME: ... i++; case INCNAME: ... i++; ... case INCNAME: ... i++; } Подскажите, пожалуйста, возможно ли это как-то реализовать? Спасибо.
|
|
|
|
|
 |
Ответов
|
Jul 10 2016, 19:12
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(zltigo @ Jul 10 2016, 15:49)  Что говорит о том, что решение поставленной задачи только с помощью конечного автомата зашло в тупик  . Можно сделать завуалированный конечный автомат, без огромных перечислений enum. На стеке. Будет что-то типа задачи со своим стеком, очередное состояние - это собственно адрес. Вход в автомат - это переключение на его стек, выход (там где был break) - обратное переключение на исходный стек. Очень удобно отлаживать. Но конечно требуется некоторая дополнительная память (стек). Я так иногда делаю когда автомат получается ну очень сложным, да ещё с вложенными ветками.
|
|
|
|
|
Jul 11 2016, 08:34
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(zltigo @ Jul 11 2016, 14:22)  Уменьшение количества состояний чаще всего достигаеся увеличенем количества автоматов. Все сколь-нибудь вменяемые протоколы разбиты на уровни и обслуживаются на каждом уровне своими автоматоми. Если безмозгло свалить все уровни в одну кучу, то получим именно катострофический рост состояний при котором "41 case" от AlexandrY и "100" от Alt.F4 это даже еще не цветочки  Это да, можно и так. Но бывают даже относительно короткие автоматы в 10-20 состояний, но со сложной логикой ветвления, условными переходами между состояниями или необходимостью выполнения повторяющихся цепочек состояний в разных местах автомата. Я не говорю конкретно про разбор кадров протокола, вопрос был общего плана об к.автоматах.
|
|
|
|
|
Jul 11 2016, 09:55
|

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

|
Цитата(jcxz @ Jul 11 2016, 11:34)  Но бывают даже относительно короткие автоматы в 10-20 состояний, но со сложной логикой ветвления, условными переходами между состояниями или необходимостью выполнения повторяющихся цепочек состояний в разных местах автомата. Несомненно! По этой причине я тоже с самого начала писал, что просто не надо все всегда ТОЛЬКО на состояния автомата валить. В каждом конкретом случае надо смотреть, как разгружать собственно автомат от излишества состояний, ибо конечный автомат не есть панацея  . Совсем недавно в казалось-бы простой задаче начал в лоб писать автомат - началось погружение в пучину состояний. Разбил на два автомата - тоже не сильно понравилось, ибо такой подход нормально работает, когда протокол на уровни бьется. В результате был сделан один автомат на 13 состояний и три бита дополнительных глобальных статусов. Цитата(AlexandrY @ Jul 11 2016, 11:48)  Но в протоколах нет рекурсий... Это просто Ваши познания в протоколах невелики  . В тех же телекомуникационных протоколах в полученном фрейме может находится, или не находится, самая разнообразная информация. Причем, как относящаяся к одному объекту, так и к разным. А сам фрейм собираться из множества небольших кусочков. Вот и начинается рекурсивный разбор полей.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 11 2016, 11:11
|

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

|
Цитата(zltigo @ Jul 11 2016, 12:55)  Это просто Ваши познания в протоколах невелики  . В тех же телекомуникационных протоколах в полученном фрейме может находится, или не находится, самая разнообразная информация. Причем, как относящаяся к одному объекту, так и к разным. А сам фрейм собираться из множества небольших кусочков. Вот и начинается рекурсивный разбор полей. Вы уж определитесь о чем хотите рассказать. Сначала у вас многоуровневые концепции, теперь опять рекурсивные. Фреймы из кусочков это связные списки, а не стековые структуры. Я не видел рекурсию на в TCP/IP, ни в Zigbee, ни в BLE, ни в USB... Ну ни где. А вы где усмотрели?
|
|
|
|
|
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
|
|
|
|
Сообщений в этой теме
Alt.F4 Инкрементирующийся define Jul 10 2016, 06:40 adnega Так получится?
Кодint j = 0;
if(0){}
else... Jul 10 2016, 06:49 Сергей Борщ "В лоб" задача решается применением enum... Jul 10 2016, 07:27 jcxz Цитата(Alt.F4 @ Jul 10 2016, 12:40) Дейст... Jul 10 2016, 07:30 adnega Цитата(jcxz @ Jul 10 2016, 10:30) Не комп... Jul 10 2016, 07:47 AlexandrY Цитата(Alt.F4 @ Jul 10 2016, 09:40) Подск... Jul 10 2016, 08:19 Владивольт Подход с enum, несомненно, правилен.
Однако, при д... Jul 10 2016, 08:38 x893 Есть такая реализация, сделана на swich/case и __L... Jul 10 2016, 09:03 AlexandrY Цитата(zltigo @ Jul 10 2016, 12:49) Что г... Jul 10 2016, 09:54  zltigo Цитата(AlexandrY @ Jul 10 2016, 12:54) Да... Jul 10 2016, 10:26   AlexandrY Цитата(zltigo @ Jul 10 2016, 13:26) Не пу... Jul 10 2016, 11:49    zltigo QUOTE (AlexandrY @ Jul 10 2016, 14:49) Пр... Jul 11 2016, 08:13  Сергей Борщ QUOTE (AlexandrY @ Jul 10 2016, 12:54) То... Jul 10 2016, 11:55   AlexandrY Цитата(Сергей Борщ @ Jul 10 2016, 14:55) ... Jul 10 2016, 12:02    Сергей Борщ QUOTE (AlexandrY @ Jul 10 2016, 15:02) Тр... Jul 10 2016, 12:40     AlexandrY Цитата(Сергей Борщ @ Jul 10 2016, 15:40) ... Jul 10 2016, 13:56  AlexandrY Цитата(jcxz @ Jul 10 2016, 22:12) Я так и... Jul 10 2016, 20:00   jcxz Цитата(AlexandrY @ Jul 11 2016, 02:00) Гд... Jul 10 2016, 20:36    AlexandrY Цитата(jcxz @ Jul 10 2016, 23:36) А зачем... Jul 11 2016, 07:01     jcxz Цитата(AlexandrY @ Jul 11 2016, 13:01) Хо... Jul 11 2016, 08:14 x893 Зря не смотрели в сторону
http://dunkels.com/adam/... Jul 10 2016, 20:33 AlexandrY Цитата(x893 @ Jul 10 2016, 23:33) Зря не ... Jul 11 2016, 08:48 x893 Protothread это скрытый switch без enum и прочей е... Jul 11 2016, 09:09 AlexandrY Цитата(x893 @ Jul 11 2016, 12:09) Смысл п... Jul 11 2016, 09:24 Kabdim Не могли бы Вы, zltigo, уточнить в каком именно пр... Jul 11 2016, 12:10 AlexandrY Цитата(Kabdim @ Jul 11 2016, 15:10) Не мо... Jul 11 2016, 13:07 zltigo Цитата(Kabdim @ Jul 11 2016, 15:10) Не мо... Jul 11 2016, 13:24 k155la3 Задавал я аналогичный вопрос
тут
но реализация чер... Jul 11 2016, 13:40 MrYuran А я таки не понял, чем enum плох?
Мало того, что в... Jul 12 2016, 07:06 AlexandrY Цитата(MrYuran @ Jul 12 2016, 10:06) А я ... Jul 12 2016, 08:26  zltigo QUOTE (AlexandrY @ Jul 12 2016, 11:26) Эт... Jul 12 2016, 09:47   Dog Pawlowa Вообще то сам по себе инкремент состояния - это по... Jul 12 2016, 14:57 yanvasiij Я бы так делать не стал, но все же...
CODEswitch ... Jul 13 2016, 05:15 k155la3 Если надо что-то "проинкриментировать" -... Jul 13 2016, 06:36 yanvasiij k155la3
Ну успел отписаться до того, как Вы все ... Jul 13 2016, 07:01 Andrew_Q Я использую таблицу состояний автомата именно в ви... Jul 14 2016, 05:55 adnega Цитата(Andrew_Q @ Jul 14 2016, 08:55) Я и... Jul 14 2016, 07:53  Andrew_Q Цитата(adnega @ Jul 14 2016, 12:53) А кто... Jul 14 2016, 09:04  k155la3 Цитата(adnega @ Jul 14 2016, 10:53) А кто... Jul 14 2016, 09:23 Владивольт Цитата(Andrew_Q @ Jul 14 2016, 09:55) сос... Jul 14 2016, 09:14  Andrew_Q Цитата(Владивольт @ Jul 14 2016, 14:14) К... Jul 14 2016, 09:29   demiurg_spb Цитата(Andrew_Q @ Jul 14 2016, 12:29) __f... Jul 14 2016, 09:45    Andrew_Q Опечатка?
Я хронический лентяй, программа работает... Jul 14 2016, 09:50   jcxz Цитата(Andrew_Q @ Jul 14 2016, 15:29) По ... Jul 15 2016, 03:26    Dog Pawlowa Цитата(jcxz @ Jul 15 2016, 06:26) А как б... Jul 15 2016, 03:47     jcxz Цитата(Dog Pawlowa @ Jul 15 2016, 09:47) ... Jul 15 2016, 05:11      Dog Pawlowa Цитата(jcxz @ Jul 15 2016, 08:11) Объедин... Jul 15 2016, 06:02       zltigo QUOTE (Dog Pawlowa @ Jul 15 2016, 09:02) ... Jul 15 2016, 07:00        Dog Pawlowa Цитата(zltigo @ Jul 15 2016, 10:00) е и т... Jul 15 2016, 07:32         zltigo QUOTE (Dog Pawlowa @ Jul 15 2016, 10:32) ... Jul 15 2016, 08:27       jcxz Цитата(Dog Pawlowa @ Jul 15 2016, 12:02) ... Jul 15 2016, 08:20 brag Тоже согласен, что если состояний больше десятка(а... Sep 7 2016, 23:12
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|