带功能指针的有限状态机

时间:2011-07-17 17:43:47

标签: c++ state-machine

我正在学习使用有限状态机来执行某些任务,但是我在浏览状态表和执行函数时遇到了问题,使其成为一个有用的系统。

考虑我的状态机:

state machine http://upload.wikimedia.org/wikipedia/en/3/30/Automata_that_prints_the_first_word_of_each_line.png

说明:
* =将字符打印到标准输出 N ='\ n'
S ='' A = aA-zZ

我从Automata-based programming on Wikipedia开始的代码适用于这样一个简单的机器,但我想修改它,以便我可以拥有一个更健壮的状态转换表,并根据这些状态调用函数。

我已在Pastebin上发布了working basic code以及the transtion table style I want to use

之前我没有使用指向函数的指针所以我不确定如何根据process_event收到的数据编写转换函数。最后我想有一个模板,允许我有状态输入/输出&转换输入/输出功能,因此我可以更有效地编写复杂的用户菜单甚至编程算法。

3 个答案:

答案 0 :(得分:2)

使用函数作为状态是非常强大的,但与使用递归函数(返回函数的函数状态)相比,使用转换表非常容易出错并且很容易出错。一个很棒的实现供您考虑quantum hierarchical statem machine。虽然它只有大约1000行代码作为基础,但它有an accompanying book来解释你可能对它如何工作的任何问题。非常强大,非常快。

答案 1 :(得分:2)

你检查了吗? Boost.msm - 用于富有表现力的UML2有限状态机的高性能库。

阅读文档,因为它完全是关于管理状态机的复杂性。

在boost中还有其他状态机实现你可能更喜欢,因为它编译得更快,因为它不是为超高速设计的(这并不意味着它不够快)Boost.Statechart - 任意复杂的有限状态机器可以用易于阅读和维护的C ++代码实现。

正如布伦特·阿里亚斯所提到的,你应该阅读http://www.state-machine.com/psicc2/index.php的书。这是国家机器圣经。

答案 2 :(得分:1)

您的编译问题表明它无法从int转换为void (*)(int)来自分支结构:

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

do_func被定义为整数,而不是void (*do_func)(int);