Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="ARV",url="/forum/viewtopic.php?p=3816695#p3816695"]в контексте вопроса о константных вычислениях функция проигрывает полностью по размеру кода, т.к. макрос вообще не порождает код, а функция - порождает.[/uquote]Я же приводил листинг. Где вы там порождение кода увидели? Константа превратилась в другую константу.

[uquote="ARV",url="/forum/viewtopic.php?p=3816695#p3816695"]а в чем еще слабость макроса в упомянутом контектсе?[/uquote]Шо, опять? Снова "этого кто-то не знал" будет?
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18793
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

VladislavS писал(а):Я же приводил листинг
вы приводили листинг С++ функции, которая в частном случае не привела к порождению кода.
я привел в пример макрос, который делает то же самое, но безусловно всегда (для константного параметра) без порождения кода, причем даже в С
вы утверждаете, что у макроса есть какие-то недостатки
мне не известны эти недостатки, и я прошу вас их реально показать
в отличие от вас, я академиев не кончал, и хочу понять, что же не так в моих познаниях, собранных, в том числе, и из мудрости разных форумов.
что вас бесит-то?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[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]Хамить изволите? И после этого рассчитываете что вас учить будут? Ну-ну.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18793
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

VladislavS писал(а):это будет обычная C функция, которая с константным аргументом тоже не будет порождать код
только в том случае, если будет особым образом оформлена и использована ТОЛЬКО с константным аргументом (и то не факт). во всех прочих случаях - будет порождать код.
VladislavS писал(а):И после этого рассчитываете что вас учить будут?
я лишь рассчитываю, что каждый говорящий в состоянии аргументировать свои слова. но если не в состоянии - я умолкаю...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[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

Сообщение NStorm »

Вопрос только о С, без плюсов.
В очередной раз по новому реализуя конечный автомат, задумался - а кто вообще как делает обычно? Также по ситуации или обычно одно и тоже?
Когда простая прошивка - делаю на свитчах. Когда сложнее, раньше обычно использовал массив структур с переходами, вроде

Код: Выделить всё

{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();
    }
}
fsGetEvent() пробегает по "стеку" эвентов и возвращает эвент с наивысшим приоритетом. fsTransition() делает простейшую проверочку и вызывает обработчик просто обратившись к его указателю в адресе 2D массива.

А вы как делаете?
Последний раз редактировалось NStorm Пн апр 13, 2020 18:41:23, всего редактировалось 1 раз.
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18793
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

но ведь двумерная таблица с ваших же слов содержит много пустот... разве это "оптимально"?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

Когда большинство эвентов из любого состояния требует переход, т.е. таблица по большей части полная - то это вполне оправдано я полагаю.
Тут смотря чем жертвовать. Если без пустот - то тратим циклы на пробежку в поисках.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18793
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

я как-то исторически организую свою программу не в виде автомата состояний в чистом виде, а именно по событийной модели "эвент - реакция". соответственно, чаще всего именно switch-ем обхожусь.
ваш подход интересный. правда, вынудит меня слишком много думать над тем, чтобы заранее рассчитать все переходы... не привычно...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

Так не надо заранее. Можно в процессе добавлять. Состояния и эвенты в любое время добавлять можно. Это просто enum, для именования. Для примера:

Код: Выделить всё

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;
Переходы также просто добавляют в массив trans[ST_LAST][EV_LAST]. Просто создается функция, делающая переход и возвращающая следующее состояние. А в массиве указатель на неё.

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

PS: Подход не мой, я его честно "на просторах" подглядел давно еще, только в англоязычной среде. Только как мне удобнее написал.
Последний раз редактировалось NStorm Пн апр 13, 2020 18:41:49, всего редактировалось 1 раз.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="NStorm",url="/forum/viewtopic.php?p=3826118#p3826118"]Состояния и эвенты[/uquote]
Только ивенты. Хедеры и ивенты, а не наоборот :)
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

Reflector, это к произношению вопрос? ) Я в курсе как оно на английском произносится, но тогда уж скорее всего "ивэнт". А "эвент" это просто англицизм, а не попытка передать звучание английского слова на кириллице )
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="NStorm",url="/forum/viewtopic.php?p=3826141#p3826141"]Я в курсе как оно на английском произносится, но тогда уж скорее всего "ивэнт". А "эвент" это просто англицизм, а не попытка передать звучание английского слова на кириллице )[/uquote]
В оригинале читаться будет скорее "ывэнт", но так практически никто не пишет, иначе "ы" будет в каждом втором слове :) Кроме того есть правила транслитерации, по ним начальная английская "E" передается русской "И", это, кстати, ответ из Института русского языка РАН, конкретно по этому слову, соответственно в Русский орфографический словарь PAH тоже попал "ивент".
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

[uquote="NStorm",url="/forum/viewtopic.php?p=3826141#p3826141"]"ивэнт".[/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. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18793
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ну вот... были же нормальные программисты, стали филологи...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

ARV, одичал народ из-за незаконного ограничения своих конституционных прав. Вот и переквалифицируется теперь из политологов в вирусологов, филологов и т.п. ☺
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

[uquote="NStorm",url="/forum/viewtopic.php?p=3826118#p3826118"]Так не надо заранее. Можно в процессе добавлять. Состояния и эвенты в любое время добавлять можно. Это просто enum, для именования. Для примера:

Код: Выделить всё

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;
[/uquote]
Хмм, а если еще добавить некий 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

Сообщение dosikus »

[uquote="ARV",url="/forum/viewtopic.php?p=3826255#p3826255"]ну вот... были же нормальные программисты, стали филологи...[/uquote]

Это возраст...
Да и лучше филологи чем "философы" от теорий заговора...
Встал на лапы
Сообщения: 118
Зарегистрирован: Вс авг 18, 2019 13:22:01

Сообщение Trully »

Чтобы не возникало лишних споров по произношению/транскрипции, пишите лучше англ.термины на English (это слово - тоже с "проблемой произношения"). Либо переведите на русский. Event = событие.
to be or not to be = -1
Модератор
Аватара пользователя
Сообщения: 19102
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

а может он не знает, как это слово называется по русски?
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Ответить

Вернуться в «Разные вопросы по МК»