Конечный автомат с указателями на функции - PullRequest
2 голосов
/ 17 июля 2011

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

Рассмотрим мой конечный автомат:

конечный автомат http://upload.wikimedia.org/wikipedia/en/3/30/Automata_that_prints_the_first_word_of_each_line.png

Пояснение:
* = Печатать символ на стандартный вывод
N = '\ n'
S = ''
A = aA-zZ

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

Я опубликовал рабочий базовый код в Pastebin вместе с стилем таблицы переходов, который я хочу использовать .

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

Ответы [ 3 ]

2 голосов
/ 19 июля 2011

Использование функций в качестве состояний очень эффективно, но использование таблиц переходов очень подвержено ошибкам и болезненно по сравнению с использованием рекурсивных функций (состояний функций, которые возвращают функции). Фантастическая реализация для вас - это квантово-иерархический механизм состояний . Хотя это всего лишь около 1000 строк кода в качестве основы, у него есть сопровождающая книга , чтобы объяснить любой вопрос о том, как он работает. Очень мощный, очень быстрый.

2 голосов
/ 19 июля 2011

Вы проверяли
Boost.msm - очень высокопроизводительная библиотека для выразительных машин с конечным числом состояний UML2.

Читайте документацию, потому что все дело в управлении сложностью в машинах состояний.

Существует также другая реализация конечного автомата в boost, которую вы могли бы предпочесть, поскольку она компилируется быстрее, поскольку не рассчитана на сверхскорость (что не означает, что она недостаточно быстра) Boost.Statechart - Произвольно сложные конечные автоматы могут быть реализованы в легко читаемом и поддерживаемом коде C ++.

Как упоминал Брент Ариас, вам следует прочитать книгу из http://www.state -machine.com / psicc2 / index.php Это Библия конечных автоматов.

1 голос
/ 19 июля 2011

Ваша проблема с компиляцией, в которой говорится, что она не может преобразовать из int в void (*)(int), была из структуры ветви:

struct branch
{
    int event_type:3;
    enum states state_new:2;
    int do_func:1;
};

do_func определяется как целое число, а не void (*do_func)(int);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...