我正在学习使用有限状态机来执行某些任务,但是我在浏览状态表和执行函数时遇到了问题,使其成为一个有用的系统。
考虑我的状态机:
说明:
* =将字符打印到标准输出
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
收到的数据编写转换函数。最后我想有一个模板,允许我有状态输入/输出&转换输入/输出功能,因此我可以更有效地编写复杂的用户菜单甚至编程算法。
答案 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)
;