[uquote="ARV",url="/forum/viewtopic.php?p=3816695#p3816695"]а в чем еще слабость макроса в упомянутом контектсе?[/uquote]Шо, опять? Снова "этого кто-то не знал" будет?
Вопросы по С/С++ (СИ)
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="ARV",url="/forum/viewtopic.php?p=3816695#p3816695"]в контексте вопроса о константных вычислениях функция проигрывает полностью по размеру кода, т.к. макрос вообще не порождает код, а функция - порождает.[/uquote]Я же приводил листинг. Где вы там порождение кода увидели? Константа превратилась в другую константу.
[uquote="ARV",url="/forum/viewtopic.php?p=3816695#p3816695"]а в чем еще слабость макроса в упомянутом контектсе?[/uquote]Шо, опять? Снова "этого кто-то не знал" будет?
[uquote="ARV",url="/forum/viewtopic.php?p=3816695#p3816695"]а в чем еще слабость макроса в упомянутом контектсе?[/uquote]Шо, опять? Снова "этого кто-то не знал" будет?
- Реклама
вы приводили листинг С++ функции, которая в частном случае не привела к порождению кода.VladislavS писал(а):Я же приводил листинг
я привел в пример макрос, который делает то же самое, но безусловно всегда (для константного параметра) без порождения кода, причем даже в С
вы утверждаете, что у макроса есть какие-то недостатки
мне не известны эти недостатки, и я прошу вас их реально показать
в отличие от вас, я академиев не кончал, и хочу понять, что же не так в моих познаниях, собранных, в том числе, и из мудрости разных форумов.
что вас бесит-то?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="ARV",url="/forum/viewtopic.php?p=3816770#p3816770"]вы приводили листинг С++ функции,[/uquote]Уберите constexpr и это будет обычная C функция, которая с константным аргументом тоже не будет порождать код.
[uquote="ARV",url="/forum/viewtopic.php?p=3816770#p3816770"]мне не известны эти недостатки, и я прошу вас их реально показать[/uquote]А зачем мне это надо? Чтобы вы опять кинулись минусить сообщения и звать маму (модератора) на помощь?
[uquote="ARV",url="/forum/viewtopic.php?p=3816770#p3816770"]в отличие от вас, я академиев не кончал, и хочу понять, что же не так в моих познаниях, собранных, в том числе, и из мудрости разных форумов.[/uquote]Сами, сами.
[uquote="ARV",url="/forum/viewtopic.php?p=3816770#p3816770"]что вас бесит-то?[/uquote]Хамить изволите? И после этого рассчитываете что вас учить будут? Ну-ну.
[uquote="ARV",url="/forum/viewtopic.php?p=3816770#p3816770"]мне не известны эти недостатки, и я прошу вас их реально показать[/uquote]А зачем мне это надо? Чтобы вы опять кинулись минусить сообщения и звать маму (модератора) на помощь?
[uquote="ARV",url="/forum/viewtopic.php?p=3816770#p3816770"]в отличие от вас, я академиев не кончал, и хочу понять, что же не так в моих познаниях, собранных, в том числе, и из мудрости разных форумов.[/uquote]Сами, сами.
[uquote="ARV",url="/forum/viewtopic.php?p=3816770#p3816770"]что вас бесит-то?[/uquote]Хамить изволите? И после этого рассчитываете что вас учить будут? Ну-ну.
только в том случае, если будет особым образом оформлена и использована ТОЛЬКО с константным аргументом (и то не факт). во всех прочих случаях - будет порождать код.VladislavS писал(а):это будет обычная C функция, которая с константным аргументом тоже не будет порождать код
я лишь рассчитываю, что каждый говорящий в состоянии аргументировать свои слова. но если не в состоянии - я умолкаю...VladislavS писал(а):И после этого рассчитываете что вас учить будут?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="ARV",url="/forum/viewtopic.php?p=3816809#p3816809"]ТОЛЬКО с константным аргументом[/uquote]Да определитесь уже, вам с константным или нет? Мне вот всё равно, функция будет работать в любом случае.
[uquote="ARV",url="/forum/viewtopic.php?p=3816809#p3816809"]во всех прочих случаях - будет порождать код.[/uquote]Во всех прочих случаях макрос в лучшем случае тоже будет попрождать код, а в худшем просто не будет работать (пример я показал), но вам об этом не скажет.
[uquote="ARV",url="/forum/viewtopic.php?p=3816809#p3816809"]во всех прочих случаях - будет порождать код.[/uquote]Во всех прочих случаях макрос в лучшем случае тоже будет попрождать код, а в худшем просто не будет работать (пример я показал), но вам об этом не скажет.
- Реклама
- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
Вопрос только о С, без плюсов.
В очередной раз по новому реализуя конечный автомат, задумался - а кто вообще как делает обычно? Также по ситуации или обычно одно и тоже?
Когда простая прошивка - делаю на свитчах. Когда сложнее, раньше обычно использовал массив структур с переходами, вроде
Но тратится время на поиск перебором. И т.к. эвенты у меня генерились прерываниями, бывали косяки. Потом уже придумал, что эвенты можно из прерываний записывать в некий стек ну или просто временные переменные и уже только лишь в нужно время выдергивать их по одному.
Сейчас вот решил сделать на двумерном массиве, что вроде как шаг назад и менее эффективно. Таблица занимает состояния * эвенты * sizeof(указатель на функцию). Сначала примеры в сети увидел когда на тему таблицы - там зачем-то заполняли все элементы. Не красиво. Подумал - ведь в современном C можно только нужные переходы указать в таблице и все будет также лаконично, как и с массивом стуктур.
Но мне нравится простота реализации. Как-то так в общем виде:
fsGetEvent() пробегает по "стеку" эвентов и возвращает эвент с наивысшим приоритетом. fsTransition() делает простейшую проверочку и вызывает обработчик просто обратившись к его указателю в адресе 2D массива.
А вы как делаете?
В очередной раз по новому реализуя конечный автомат, задумался - а кто вообще как делает обычно? Также по ситуации или обычно одно и тоже?
Когда простая прошивка - делаю на свитчах. Когда сложнее, раньше обычно использовал массив структур с переходами, вроде
Код: Выделить всё
{STATE1, EVENT1, handler_1},
{STATE1, EVENT1, handler_2},
{STATE2, EVENT2, handler_3}
Сейчас вот решил сделать на двумерном массиве, что вроде как шаг назад и менее эффективно. Таблица занимает состояния * эвенты * sizeof(указатель на функцию). Сначала примеры в сети увидел когда на тему таблицы - там зачем-то заполняли все элементы. Не красиво. Подумал - ведь в современном C можно только нужные переходы указать в таблице и все будет также лаконично, как и с массивом стуктур.
Но мне нравится простота реализации. Как-то так в общем виде:
Спойлер
Код: Выделить всё
eState fsNormalBypass() {
...
}
...
// Transition table type
typedef eState (*trans_t[ST_LAST][EV_LAST])(void);
// Transition table
trans_t trans = {
[ST_NORMAL][EV_BTN_SHORT] = fsNormalBypass,
[ST_NORMAL][EV_BTN_LONG] = fsNormalClosed,
[ST_BYPASS][EV_BTN_SHORT] = fsBypassNormal
...
};
// Get event in order of priority
eEvent fsGetEvent() {
eEvent ret = EV_NONE;
...
return ret;
}
// Run the transition based on event
eRetCode fsTransition() {
#ifdef VERBOSE_LOGS
LOG("Transition: st %d, ev %d\r\n", state.cur_state, state.event);
#endif
if ((state.event < EV_LAST) && trans[state.cur_state][state.event] != NULL) {
state.prev_state = state.cur_state; // save previous state
state.cur_state = trans[state.cur_state][state.event](); // run the transition
return RET_OK;
}
return RET_ERROR;
}
int main(void)
{
...
while(1)
{
state.event = fsGetEvent();
if (state.event != EV_NONE)
fsTransition();
}
}
А вы как делаете?
Последний раз редактировалось NStorm Пн апр 13, 2020 18:41:23, всего редактировалось 1 раз.
но ведь двумерная таблица с ваших же слов содержит много пустот... разве это "оптимально"?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
Когда большинство эвентов из любого состояния требует переход, т.е. таблица по большей части полная - то это вполне оправдано я полагаю.
Тут смотря чем жертвовать. Если без пустот - то тратим циклы на пробежку в поисках.
Тут смотря чем жертвовать. Если без пустот - то тратим циклы на пробежку в поисках.
я как-то исторически организую свою программу не в виде автомата состояний в чистом виде, а именно по событийной модели "эвент - реакция". соответственно, чаще всего именно switch-ем обхожусь.
ваш подход интересный. правда, вынудит меня слишком много думать над тем, чтобы заранее рассчитать все переходы... не привычно...
ваш подход интересный. правда, вынудит меня слишком много думать над тем, чтобы заранее рассчитать все переходы... не привычно...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
Так не надо заранее. Можно в процессе добавлять. Состояния и эвенты в любое время добавлять можно. Это просто enum, для именования. Для примера:
Переходы также просто добавляют в массив trans[ST_LAST][EV_LAST]. Просто создается функция, делающая переход и возвращающая следующее состояние. А в массиве указатель на неё.
Я наоборот подобный подход решил использовать для простоты расширения и добавления новых состояний и переходов. Потому что когда их становится много, код может стать сложночитаемый, если все переходы в одном месте собраны.
PS: Подход не мой, я его честно "на просторах" подглядел давно еще, только в англоязычной среде. Только как мне удобнее написал.
Код: Выделить всё
typedef enum {ST_NONE, ST_IDLE, ST_CALIBRATION, ST_NORMAL, ST_BYPASS, ST_OVERFLOW, ST_RESTORATION, ST_MAINTAINCE, ST_LAST} eState;
typedef enum {EV_NONE, EV_BTN_SHORT, EV_BTN_LONG, EV_BAT_LOW, EV_AC_SHORTAGE, EV_TIMEOUT, EV_LAST} eEvent;
Я наоборот подобный подход решил использовать для простоты расширения и добавления новых состояний и переходов. Потому что когда их становится много, код может стать сложночитаемый, если все переходы в одном месте собраны.
PS: Подход не мой, я его честно "на просторах" подглядел давно еще, только в англоязычной среде. Только как мне удобнее написал.
Последний раз редактировалось NStorm Пн апр 13, 2020 18:41:49, всего редактировалось 1 раз.
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="NStorm",url="/forum/viewtopic.php?p=3826118#p3826118"]Состояния и эвенты[/uquote]
Только ивенты. Хедеры и ивенты, а не наоборот
Только ивенты. Хедеры и ивенты, а не наоборот
- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
Reflector, это к произношению вопрос? ) Я в курсе как оно на английском произносится, но тогда уж скорее всего "ивэнт". А "эвент" это просто англицизм, а не попытка передать звучание английского слова на кириллице )
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="NStorm",url="/forum/viewtopic.php?p=3826141#p3826141"]Я в курсе как оно на английском произносится, но тогда уж скорее всего "ивэнт". А "эвент" это просто англицизм, а не попытка передать звучание английского слова на кириллице )[/uquote]
В оригинале читаться будет скорее "ывэнт", но так практически никто не пишет, иначе "ы" будет в каждом втором слове
Кроме того есть правила транслитерации, по ним начальная английская "E" передается русской "И", это, кстати, ответ из Института русского языка РАН, конкретно по этому слову, соответственно в Русский орфографический словарь PAH тоже попал "ивент".
В оригинале читаться будет скорее "ывэнт", но так практически никто не пишет, иначе "ы" будет в каждом втором слове
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
[uquote="NStorm",url="/forum/viewtopic.php?p=3826141#p3826141"]"ивэнт".[/uquote]
"ивент" правильней. Потому что там не звук 'æ', а звук 'e'!
[uquote="ARV",url="/forum/viewtopic.php?p=3826103#p3826103"]я как-то исторически организую свою программу не в виде автомата состояний в чистом виде, а именно по событийной модели[/uquote]
А я стараюсь классических автоматов придерживаться. Если нужно что-то сделать в прерывании, то выставляю вспомогательные флаги, а уж в процедуре-автомате их обрабатываю с возможной сменой состояния.
"ивент" правильней. Потому что там не звук 'æ', а звук 'e'!
[uquote="ARV",url="/forum/viewtopic.php?p=3826103#p3826103"]я как-то исторически организую свою программу не в виде автомата состояний в чистом виде, а именно по событийной модели[/uquote]
А я стараюсь классических автоматов придерживаться. Если нужно что-то сделать в прерывании, то выставляю вспомогательные флаги, а уж в процедуре-автомате их обрабатываю с возможной сменой состояния.
Последний раз редактировалось Eddy_Em Пн апр 13, 2020 08:51:03, всего редактировалось 1 раз.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Я на гитхабе, в ЖЖ
ну вот... были же нормальные программисты, стали филологи...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
ARV, одичал народ из-за незаконного ограничения своих конституционных прав. Вот и переквалифицируется теперь из политологов в вирусологов, филологов и т.п. ☺
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Я на гитхабе, в ЖЖ
- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
[uquote="NStorm",url="/forum/viewtopic.php?p=3826118#p3826118"]Так не надо заранее. Можно в процессе добавлять. Состояния и эвенты в любое время добавлять можно. Это просто enum, для именования. Для примера:
[/uquote]
Хмм, а если еще добавить некий ST_ANY и переписать обработчик переходов как-то так:
То в таблицу можно добавлять общий обработчик перехода из любого состояния для определенных ивентов, чтобы не рисовать всю таблицу. Опять же это чуть лишней оперативки в угоду читаемости и удобства.
Код: Выделить всё
typedef enum {ST_NONE, ST_IDLE, ST_CALIBRATION, ST_NORMAL, ST_BYPASS, ST_OVERFLOW, ST_RESTORATION, ST_MAINTAINCE, ST_LAST} eState;
typedef enum {EV_NONE, EV_BTN_SHORT, EV_BTN_LONG, EV_BAT_LOW, EV_AC_SHORTAGE, EV_TIMEOUT, EV_LAST} eEvent;
Хмм, а если еще добавить некий ST_ANY и переписать обработчик переходов как-то так:
Код: Выделить всё
// Run the transition based on event
eRetCode fsTransition() {
if ((state.event < EV_ANY) && (trans[state.cur_state][state.event] != NULL || trans[ST_ANY][state.event] != NULL)) {
if (trans[state.cur_state][state.event] != NULL)
state.cur_state = trans[state.cur_state][state.event](); // run the transition
else if (trans[ST_ANY][state.event] != NULL) // Catch on any state handler
state.cur_state = trans[ST_ANY][state.event]();
return RET_OK;
}
return RET_ERROR;
}
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
[uquote="ARV",url="/forum/viewtopic.php?p=3826255#p3826255"]ну вот... были же нормальные программисты, стали филологи...[/uquote]
Это возраст...
Да и лучше филологи чем "философы" от теорий заговора...
Это возраст...
Да и лучше филологи чем "философы" от теорий заговора...
- Сообщения: 118
- Зарегистрирован: Вс авг 18, 2019 13:22:01
Чтобы не возникало лишних споров по произношению/транскрипции, пишите лучше англ.термины на English (это слово - тоже с "проблемой произношения"). Либо переведите на русский. Event = событие.
to be or not to be = -1
а может он не знает, как это слово называется по русски?
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.


