|
Инкрементирующийся 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 14 2016, 05:55
|
Группа: Участник
Сообщений: 7
Регистрация: 27-05-05
Пользователь №: 5 449

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

|
Цитата(Andrew_Q @ Jul 14 2016, 09:55)  состояние-событие-выполнить действие-перейти в новое состояние Как быть с ветвлением, т.е. если новое состояние определяется исходом действия?
--------------------
#define TRUE (4==(2*2))
|
|
|
|
|
Jul 14 2016, 09:29
|
Группа: Участник
Сообщений: 7
Регистрация: 27-05-05
Пользователь №: 5 449

|
Цитата(Владивольт @ Jul 14 2016, 14:14)  Как быть с ветвлением, т.е. если новое состояние определяется исходом действия? По исходу действия генерируем событие, в таблице описываем переход по этому событию в нужное состояние. У меня таблица выглядит так CODE __flash state_table_type STATE_MODBUS_NASTER_TABLE[]= // Таблица состояний, условий перехода и действий режима ModBus мастер { /* из состояния по событию выполнить в состояние в режим */
{ANY_STATE, NOT_NET_ACCESS, init_state_mashine, INIT, MODBUS_MASTER}, {ANY_STATE, TIMER_OVFL, init_state_mashine, INIT, MODBUS_MASTER}, {INIT, NET_ACCESS, request_ana_from_monoblock, WAIT_MONOBLOCK_ANA, MODBUS_MASTER}, {WAIT_MONOBLOCK_ANA, MONOBLOCK_DATA_RECEIVED,send_ana_to_modbus, WAIT_CHECK_MODBUS_ANA, MODBUS_MASTER}, {WAIT_CHECK_MODBUS_ANA, MODBUS_SENDED, receive_ana_modbus_check, NO_NEW_STATE, MODBUS_MASTER}, {WAIT_CHECK_MODBUS_ANA, MODBUS_RECEIVED, test_ana_modbus_check, NO_NEW_STATE, MODBUS_MASTER}, }
|
|
|
|
|
Jul 15 2016, 03:47
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(jcxz @ Jul 15 2016, 06:26)  А как быть если после некоторых состояний необходимо пройти через определённую цепочку состояний, а затем вернуться к исходной цепочке? Ваш пример похож на последовательность выполнения строк на бэйсике, соответственно используется что-то типа GOSUB  Ну и объединить цепочку состояний в одно состояние с дополнительным индексом ничего не мешает. Регулярность и простота автоматов - хорошо, но все же иногда нужно немного и усложнять реализацию.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Jul 15 2016, 05:11
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Dog Pawlowa @ Jul 15 2016, 09:47)  Ваш пример похож на последовательность выполнения строк на бэйсике, соответственно используется что-то типа GOSUB  Ну и объединить цепочку состояний в одно состояние с дополнительным индексом ничего не мешает. Регулярность и простота автоматов - хорошо, но все же иногда нужно немного и усложнять реализацию. Объединить? А что тогда мешает объединить все остальные состояния автомата в одно? Если ничего - то и автомат не нужен, так как всего одно состояние осталось. А если есть автомат - значит он для чего-то нужен и нельзя объединить состояния. А если нужен доплнительный индекс, то как потом возвращаться к основному? А если не один уровень вложенности, а больше? Стек хранения состояний городить?
|
|
|
|
Сообщений в этой теме
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 zltigo QUOTE (Alt.F4 @ Jul 10 2016, 09:40) Дейст... Jul 10 2016, 09:49 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 jcxz Цитата(zltigo @ Jul 10 2016, 15:49) Что г... Jul 10 2016, 19:12  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  zltigo QUOTE (jcxz @ Jul 10 2016, 22:12) Можно с... Jul 11 2016, 08:22   jcxz Цитата(zltigo @ Jul 11 2016, 14:22) Умень... Jul 11 2016, 08:34    zltigo Цитата(jcxz @ Jul 11 2016, 11:34) Но быва... Jul 11 2016, 09:55     AlexandrY Цитата(zltigo @ Jul 11 2016, 12:55) Это п... Jul 11 2016, 11:11      zltigo QUOTE (AlexandrY @ Jul 11 2016, 14:11) Вы... Jul 11 2016, 11:43 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 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   demiurg_spb Цитата(Andrew_Q @ Jul 14 2016, 12:29) __f... Jul 14 2016, 09:45    Andrew_Q Опечатка?
Я хронический лентяй, программа работает... Jul 14 2016, 09:50      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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|