|
Инкрементирующийся 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, 09:54
|

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

|
Цитата(zltigo @ Jul 10 2016, 12:49)  Что говорит о том, что решение поставленной задачи только с помощью конечного автомата зашло в тупик  . Думайте о комбинации методов. Да нормально, есть прикладные протоколы с очень большими словарями. Только вот enum для этого негодное средство, поскольку при отладке невозможно узнать значение макроса и приходится все равно либо в комментариях либо прямым присваиванием вписывать числа.
|
|
|
|
|
Jul 10 2016, 10:26
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|