реклама на сайте
подробности

 
 
> Инкрементирующийся define, c помощью препроцессор Си
Alt.F4
сообщение Jul 10 2016, 06:40
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 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++;
}

Подскажите, пожалуйста, возможно ли это как-то реализовать?
Спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Andrew_Q
сообщение Jul 14 2016, 05:55
Сообщение #2





Группа: Участник
Сообщений: 7
Регистрация: 27-05-05
Пользователь №: 5 449



Я использую таблицу состояний автомата именно в виде таблицы во флеш, а парсер этой таблицы ее просто сканирует и выполняет действия в соответствии "состояние-событие-выполнить действие-перейти в новое состояние". В этом случае вся логика автомата содержится в таблице и любое добавление, удаление или редактирование любой строки влияет только на действия именно этой строки.
Go to the top of the page
 
+Quote Post
Владивольт
сообщение Jul 14 2016, 09:14
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 168
Регистрация: 14-02-10
Пользователь №: 55 490



Цитата(Andrew_Q @ Jul 14 2016, 09:55) *
состояние-событие-выполнить действие-перейти в новое состояние

Как быть с ветвлением, т.е. если новое состояние определяется исходом действия?


--------------------
#define TRUE (4==(2*2))
Go to the top of the page
 
+Quote Post
Andrew_Q
сообщение Jul 14 2016, 09:29
Сообщение #4





Группа: Участник
Сообщений: 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},
}
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 15 2016, 03:26
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Andrew_Q @ Jul 14 2016, 15:29) *
По исходу действия генерируем событие, в таблице описываем переход по этому событию в нужное состояние.

А как быть если после некоторых состояний необходимо пройти через определённую цепочку состояний, а затем вернуться к исходной цепочке? И так - в разных местах. rolleyes.gif
состояние1
состояние2
состояние10
состояние11
состояние12
состояние3
состояние4
состояние5
состояние10
состояние11
состояние12
состояние6
...
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jul 15 2016, 03:47
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(jcxz @ Jul 15 2016, 06:26) *
А как быть если после некоторых состояний необходимо пройти через определённую цепочку состояний, а затем вернуться к исходной цепочке?

Ваш пример похож на последовательность выполнения строк на бэйсике, соответственно используется что-то типа GOSUB sm.gif
Ну и объединить цепочку состояний в одно состояние с дополнительным индексом ничего не мешает.
Регулярность и простота автоматов - хорошо, но все же иногда нужно немного и усложнять реализацию.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 15 2016, 05:11
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Dog Pawlowa @ Jul 15 2016, 09:47) *
Ваш пример похож на последовательность выполнения строк на бэйсике, соответственно используется что-то типа GOSUB sm.gif
Ну и объединить цепочку состояний в одно состояние с дополнительным индексом ничего не мешает.
Регулярность и простота автоматов - хорошо, но все же иногда нужно немного и усложнять реализацию.

Объединить? А что тогда мешает объединить все остальные состояния автомата в одно? Если ничего - то и автомат не нужен, так как всего одно состояние осталось. А если есть автомат - значит он для чего-то нужен и нельзя объединить состояния.
А если нужен доплнительный индекс, то как потом возвращаться к основному? А если не один уровень вложенности, а больше? Стек хранения состояний городить?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 1st August 2025 - 20:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.01769 секунд с 7
ELECTRONIX ©2004-2016