State_Maschine

Здравствуйте, Уважаемый All!

Очень хочется узнать, как наиболее эффективно в С реализовать subj. Простейший прием через оператор switch мне известен, но ведь он, похоже, работает перебором всех case-ов. А это проигрыш в скорости. Также интересует - кто-нибудь делал класс subj-а для C++? Поделитесь пожалуйста.

Всего Вам Хорошего Ольга

Reply to
Olga Nonova
Loading thread data ...
Reply to
Nickita A Startcev
Reply to
Alexandr Torres

Здравствуйте, Уважаемый Alexandr!

Tue Jul 04 2006 12:58, Alexandr Torres wrote to Olga Nonova:

ON>> Простейший прием через оператор switch мне известен, но ведь он, ON>> похоже, работает перебором всех case-ов. А это проигрыш в скорости.

AT> Hеобязательно. AT> Hапример в Такскинге для 51-х - можно было переключать прагмой режим AT> работы свитча сравнением/по таблице.

Во втором случае, по-видимому становилось обязательным требование, чтобы выражение при switch принимало значения 0,1,2,3... Т.е. индекс для таблицы jamp-ов. Иначе я не представляю, как пользоваться такой таблицей.

Всего Вам Хорошего Ольга

Reply to
Olga Nonova
Reply to
Alexandr Torres

Здравствуйте, Уважаемый Alexandr!

Tue Jul 04 2006 13:37, Alexandr Torres wrote to Olga Nonova:

AT>>> работы свитча сравнением/по таблице.

ON>> Во втором случае, по-видимому становилось обязательным требование, ON>> чтобы выражение при switch принимало значения 0,1,2,3...

AT> В стейт-машине, как правило, по другому и не бывает.

Однако, не знаю как в просто С, но в С++ нет никаких ограничений на тип и значения выражения при switch. Именно такая универсальность и вынуждает компилятор реализовать перебор со сранением, что для ембеднутых устройств не есть хорошо.

По поводу "по другому не бывает" о нумерации состояний как 0,1,2..., то в макроассемблере есть чрезвычайно изящное решение с использованием indirect jmp-а, а регистр-указатель принимает значения непосредственно адресов меток перехода. Имена меток и несут в себе название стейтов. При этом не надо никаких таблиц jmp-ов и перекодировок из индексов в физические адреса. Жаль, что ничего подобного в С реализовать похоже нельзя.

Всего Вам Хорошего Ольга

Reply to
Olga Nonova
Reply to
Alexandr Torres
Reply to
Nicolas Minakov

Здравствуйте, Уважаемый Alexandr!

Tue Jul 04 2006 15:23, Alexandr Torres wrote to Olga Nonova:

ON>> Однако, не знаю как в просто С, но в С++ нет никаких ограничений на тип ON>> и значения выражения при switch.

AT> Дело не в ограничениях на тип в свитче, а на ДHК разработчика, пишущего AT> стей-машину.

А как быть с ДHК авторов C++?

ON>> По поводу "по другому не бывает" о нумерации состояний как 0,1,2..., то ON>> в макроассемблере есть чрезвычайно изящное решение с использованием ON>> indirect jmp-а, а регистр-указатель принимает значения непосредственно ON>> адресов меток перехода. Имена меток и несут в себе название стейтов. ON>> При этом не надо никаких таблиц jmp-ов и перекодировок из индексов в ON>> физические адреса. Жаль, что ничего подобного в С реализовать похоже ON>> нельзя.

AT> И не надо самому, компилятор все сделает, если он не убогий.

"Это вряд-ли".(с) Просто, здесь один из тех случаев, когда ассемблер лучше ЯВУ.

Всего Вам Хорошего Ольга

Reply to
Olga Nonova

Здравствуйте, Уважаемый Slav!

Tue Jul 04 2006 15:05, Slav Matveev wrote to Olga Nonova:

ON>> ... становилось обязательным требование, ON>> чтобы выражение при switch принимало значения 0,1,2,3... Т.е. индекс ON>> для таблицы jamp-ов. Иначе я не представляю, как пользоваться такой ON>> таблицей.

SM> неиспользуемые значения ведут на конец swtich'а.

Проблема в другом. В С++ нормально, но неэффективно для ембеднутых работает такая конструкция переключателя:

switch (SomeChar) { case 'A': Do_A(); break; case 'B': Do_B(); break; default: Dо_Default(); break; }

Допустима в С (без плюсов) такая конструкция из значений case-ов? И что компильнет компилятор- тоже очень интересно.

Всего Вам Хорошего Ольга

Reply to
Olga Nonova
Reply to
Alexandr Torres

formatting link
раздел автоматы. Там ещё ссылки есть.

Афтары жжоте. При достаточно большом числе вариантов это реализуется (опреатор switch) -- таблично.

А класс со всми насквозь виртуальнымми функциями -- это не проигрыш в скорости. А то у некоторых архитектур ещё сложности с вызовом по ссылке...

Reply to
Kirill Frolov

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.