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

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> Инкрементирующийся define, c помощью препроцессор Си
zltigo
сообщение Jul 11 2016, 11:43
Сообщение #31


Гуру
******

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



QUOTE (AlexandrY @ Jul 11 2016, 14:11) *
Вы уж определитесь о чем хотите рассказать.
Сначала у вас многоуровневые концепции, теперь опять рекурсивные.

О том, что и написал в первом посте. Если количество состояний автомата начинает измеряться десятками и тем более сотнями, то конечный автомат пишется НЕПРАВИЛЬНО. Как с этим бороться - рецепты разные. В том числе и рекурсия в явном или неявном виде.
QUOTE
Я не видел рекурсию на в TCP/IP, ни в Zigbee, ни в BLE, ни в USB... Ну ни где.

Вот я и говорю, что познания Ваши невелеки sad.gif.
Есть целые пласты протоколов находящиеся далеко за пределами сознания бытовых компьютерщиков. Они, напрмер, живут здесь: https://en.wikipedia.org/wiki/ITU-T отличительная их особенность, что создавались и оттачивались они годами и десятилениями и служат не для того, что бы какая нибудь фирма могла быстро родить урода по собственному невеликому разумению и засрать рынок заставля конкурентов ковыряться в дерьме добиваясь совместмости и работоспособности. А совсем с противоположной целью. При этом типовой ITU-ный стиль описания протоколов это конечные автоматы. Так уж получилось, что большую часть своей жизни я занимался именно телекомуникационными протоколами. Отчего и образовался более, чем скептический взгляд на то, что рожают и изобилии околокомпьютерщики и что является, как например, TCP/IP в лучшем случае огрызком давно существующих стеков протоколов.




--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Jul 11 2016, 12:10
Сообщение #32


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Не могли бы Вы, zltigo, уточнить в каком именно протоколе ITU-T рекурсивный разбор полей?
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jul 11 2016, 13:07
Сообщение #33


Ally
******

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



Цитата(Kabdim @ Jul 11 2016, 15:10) *
Не могли бы Вы, zltigo, уточнить в каком именно протоколе ITU-T рекурсивный разбор полей?


Он наверно имеет в виду DHCP где минимум 71 case в реализации.
Протоколы ITU-T из-за их всеядности и резиновости просто кошмарное количество switch-case требуют.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 11 2016, 13:24
Сообщение #34


Гуру
******

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



Цитата(Kabdim @ Jul 11 2016, 15:10) *
Не могли бы Вы, zltigo, уточнить в каком именно протоколе ITU-T рекурсивный разбор полей?

Как ТРЕБОВАНИЕ реализовывать что либо рекурсивно - естественно, в описании протоколов этого нет. Описание протроколов никак не описывает способов их реализации, хотя на верхнем уровне протокол описывается как конечный автомат и соответственно подталкивает на этот путь.
В конкретной реализации протокола все уже на откуп того, кто реализовывет. Я использовал рекурсивные вызовы автомата уже на уровне MTP3.
Цитата(AlexandrY @ Jul 11 2016, 16:07) *
Он наверно имеет в виду DHCP где минимум 71 case в реализации.

С каких пор студенческий самодуй DHСP стал иметь отношение к ITU? Разномастные огрызки разных RFC это вообще не стандарт.
Цитата
Протоколы ITU-T из-за их всеядности и резиновости просто кошмарное количество switch-case требуют.

ITU-T протоколы не требуют "кошмарных" количеств "case". По причине того, что они изначально разделены и хорошо суктурированы по уровням. Если же практическую реализацию делать бездумно смешивая в одну кучу что попало, то тогда, конечно, количество состояний для обеспечия функционирования можно раздувать хоть до "71" хоть до тысяч.
DHCP с 71 case, это как раз пример безмозглого подхода к делу sad.gif в стиле давай-давай, что тут думать трясти надо. Это обычно для "компьютерщиков", которые недоучившись и недопоняв сначала сотворив огрызок TCP/IP из того, что смогли понять в X.25 стеке, начали городить бездумно городить "протоколы" и дальше.
В результате начальное "упрощение", выкидывание, объедиение и усечение уровней ведет при попытке реализовать что либо сложнее, чем "два байта переслать" к каше из уровней, множества заплаток и появлениям "DHCP где минимум 71 case". Я все понимаю, почему так все растет - бурно в 70x началась компьютеоизация и микроконтролизация. Все сделать сразу по уму и аккуратно было сложно, или воообще почти невозможно из-за отсутсвия те-же аппаратных ресурсов. Мозговых ресурсов тоже не хватало - хлынул поток студентов нахватавшихся только вершков. Все понятно. И то, что выросло, то выросло http://inet777.ru/esli-byi-stroiteli-stroi...vilizaciyu/8476


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jul 11 2016, 13:40
Сообщение #35


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

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Задавал я аналогичный вопрос
тут
но реализация через boost меня ужаснула.
Вместо С-препроцессора проще сделать свой для pre-build.
Так и сделал. Так и доволен сделаным.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jul 12 2016, 07:06
Сообщение #36


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



А я таки не понял, чем enum плох?
Мало того, что все по порядку, так можно добавить последний элемент eNumOfItems и получить автоматически количество элементов, которое можно вставить в определения массивов или в циклы, etc.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jul 12 2016, 08:26
Сообщение #37


Ally
******

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



Цитата(MrYuran @ Jul 12 2016, 10:06) *
А я таки не понял, чем enum плох?
Мало того, что все по порядку, так можно добавить последний элемент eNumOfItems и получить автоматически количество элементов, которое можно вставить в определения массивов или в циклы, etc.

Правильное тактическое применение enum это когда назначаешь переменной символьное имя и проверяешь всегда у нее только символьное имя.
А если надо enum сравнивать с int то это уже неправильное применение enum.
О чем отладчики и намекают не показывая числовое значение переменной с типом enum.
Цитата(zltigo @ Jul 11 2016, 16:24) *
Все сделать сразу по уму и аккуратно было сложно, или воообще почти невозможно из-за отсутсвия те-же аппаратных ресурсов. Мозговых ресурсов тоже не хватало - хлынул поток студентов нахватавшихся только вершков. Все понятно.

Это заблуждение разработчика видимо давно не имевшего практику разработки современных приложений.

Нынче длинные switch-case редко встретишь потому что протоколы разрослись настолько, что им этот механизм стал мал. Строят целы базы данных в виде таблиц с сотнями и тысячами записей.
Для такого switch-case просто физически писать уже невмоготу, потому при разборе протоколов переходят на движки с поиском по базе данных. Взгляните на ATT в BLE
Это ухудшает конечно производительность, но и процессоры стали быстрее.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 12 2016, 09:47
Сообщение #38


Гуру
******

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



QUOTE (AlexandrY @ Jul 12 2016, 11:26) *
Это заблуждение разработчика видимо давно не имевшего практику разработки современных приложений.

Это ЗНАНИЕ разработчика, который ЗНАЕТ, что если разрабатывать и писать реализации через анус, то case разрастаются немеряно. Что свидетельвует о НЕПРАВИЛЬНОМ подходе к реализации. О чем сразу в первом посте и написал. О том, что "современные" приложения рожают через анус, потому, что и ума и времени нехватает, тоже писал.
QUOTE
...писать уже невмоготу, потому при разборе протоколов переходят на движки с поиском по базе данных.

Теперь, если вернуться к TC и case, то очень, очень полагаю, что ничего сколь-нибудь выдающищегося и затмевающего своей сложностью "ATT в BLE" и иже с ним он не пишет, а просто и банально из-за необдуманости реализации тонет в плодящихся состояних конечного автомата sad.gif.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jul 12 2016, 14:57
Сообщение #39


Гуру
******

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



Вообще то сам по себе инкремент состояния - это потенциальная угроза ошибки. Сейчас ручками вписываю конкретное текстовое состояние перехода (из enum, или enum+X-macro).


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


Местный
***

Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041



Я бы так делать не стал, но все же...

CODE
switch (i)
{
#define INC_DEF 0
#define TMP_DEF INC_DEF+1
case INC_DEF:
...
break;

#undef INC_DEF
#define INC_DEF TMP_DEF
#undef TMP_DEF
#define TMP_DEF INC_DEF+1

case INC_DEF:
...
break;

#undef INC_DEF
#define INC_DEF TMP_DEF
#undef TMP_DEF
#define TMP_DEF INC_DEF+1
case INC_DEF:
...
break;

#undef INC_DEF
#define INC_DEF TMP_DEF
#undef TMP_DEF
#define TMP_DEF INC_DEF+1

case INC_DEF:
...
break;

...
}

Go to the top of the page
 
+Quote Post
k155la3
сообщение Jul 13 2016, 06:36
Сообщение #41


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

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Если надо что-то "проинкриментировать" - надо сгенерировать некую таблицу (массив const структур во флеш), или несколько таблиц с требуемой инф-ей.
Опятьже - сделать свой препроцессор. ОНО будет читабельнее, логичнее без идиотизма когда средство важнее цели.
Если конечно цель - не сделать "глухой" проект, в котором только писатель и разбирается.


Цитата(Dog Pawlowa @ Jul 12 2016, 17:57) *
Вообще то сам по себе инкремент состояния - это потенциальная угроза ошибки. Сейчас ручками вписываю конкретное текстовое состояние перехода (из enum, или enum+X-macro).


Вот я по Вашей наводке так и делаю. Гранд мерси sm.gif
enum - генерация последовательных индексов массива,
и ониже - для инициализации массива констант-структур.
(реализация сколько-угодно-уровневого меню).

Сообщение отредактировал k155la3 - Jul 13 2016, 06:55
Go to the top of the page
 
+Quote Post
yanvasiij
сообщение Jul 13 2016, 07:01
Сообщение #42


Местный
***

Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041



k155la3

Ну успел отписаться до того, как Вы все удалили. Да, вы правы, это даже не скомпилится. Макроопределение - не переменная, она развертываются каждый раз заново, потому ошибка вылезет уже на втором переопределении. Виноват sad.gif
Go to the top of the page
 
+Quote Post
Andrew_Q
сообщение Jul 14 2016, 05:55
Сообщение #43





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



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


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Andrew_Q @ Jul 14 2016, 08:55) *
Я использую таблицу состояний автомата именно в виде таблицы во флеш, а парсер этой таблицы ее просто сканирует и выполняет действия в соответствии "состояние-событие-выполнить действие-перейти в новое состояние". В этом случае вся логика автомата содержится в таблице и любое добавление, удаление или редактирование любой строки влияет только на действия именно этой строки.

А кто придумывает номера для "состояний"?
При добавлении новой записи нужно править поле "перейти в новое состояние" предыдущей записи?
Или можно ставить только поля "событие" и "выполнить действие" а выполняться все будет линейно пока не дойдет до конца таблицы?
Go to the top of the page
 
+Quote Post
Andrew_Q
сообщение Jul 14 2016, 09:04
Сообщение #45





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



Цитата(adnega @ Jul 14 2016, 12:53) *
А кто придумывает номера для "состояний"?
При добавлении новой записи нужно править поле "перейти в новое состояние" предыдущей записи?
Или можно ставить только поля "событие" и "выполнить действие" а выполняться все будет линейно пока не дойдет до конца таблицы?


Еще один enum

Если при правке выясняется, что нужно перейти в другое состояние, то да, нужно исправлять.
Если планируется, что все будет выполняться линейно, то это проще прописать в парсере один раз, тогда поле "перейти в состояние" в таблице отмирает.
Go to the top of the page
 
+Quote Post

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

 


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


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