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

 
 
> Инкрементирующийся 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
Ответов
zltigo
сообщение Jul 10 2016, 09:49
Сообщение #2


Гуру
******

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



QUOTE (Alt.F4 @ Jul 10 2016, 09:40) *
Действий порядка 100...

Что говорит о том, что решение поставленной задачи только с помощью конечного автомата зашло в тупик sad.gif.
Думайте о комбинации методов. Более-менее типичный выход из такой ситуации это использование наряду с состоянием конечного автомата дополнительных битовых флагов.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jul 10 2016, 09:54
Сообщение #3


Ally
******

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



Цитата(zltigo @ Jul 10 2016, 12:49) *
Что говорит о том, что решение поставленной задачи только с помощью конечного автомата зашло в тупик sad.gif.
Думайте о комбинации методов.

Да нормально, есть прикладные протоколы с очень большими словарями.

Только вот enum для этого негодное средство,
поскольку при отладке невозможно узнать значение макроса и приходится все равно либо в комментариях либо прямым присваиванием вписывать числа.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 10 2016, 10:26
Сообщение #4


Гуру
******

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



Цитата(AlexandrY @ Jul 10 2016, 12:54) *
Да нормально, есть прикладные протоколы с очень большими словарями.

Не путайте протоколы с их РЕАЛИЗАЦИЕЙ через анус. Сотня состояний конечного автомата это уже анус.
Цитата(AlexandrY @ Jul 10 2016, 12:54) *
Только вот enum для этого негодное средство,
поскольку при отладке...

Отладка сколь-нибудь серьезных ПРОТОКОЛОВ отладчиком есть абсолютно непригодное средство, ибо все проблемы взаимодействия оборудования раснообразных производителей начнутся не тогда, когда все лежит на столе.
Так что логирование состояния конечного автомата обязательно, ну а при логировании разворачивание названий состояний в текст так же обязательно. Все это решается через общую функцию изменения состояния автомата. Например:
Код
void q921_set_state( LAPD_t *ldp, ulong new_state  )
{
    ldp->state =  new_state;
    dprintf( "\tL%1X:Set State`%s`(Cmd:%4X)\r", ldp->ch, q2_states[ldp->state], ldp->q921_cmd );
}


--------------------
Feci, quod potui, faciant meliora potentes
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
|||- - 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
- - 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


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

 


RSS Текстовая версия Сейчас: 2nd August 2025 - 05:41
Рейтинг@Mail.ru


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