我在文章中稍后阅读了http://www.netrino.com/Embedded-Systems/How-To/State-Machines-Event-Driven-Systems,他们用C语言提供了小型FSM的实现。
我不太明白为什么他们选择了函数指针。在我的理解中,当需要相同的接口时,指向函数的指针是有用的,但是对于不同类型的“事件”,例如解析一些Internet协议包(方便地将一个指针注册到函数并为其分配不同的函数,一个解析) HTTP,第二个解析FTP等等。这只是一个例子,但我认为你明白了我的观点。)
但这不是我在文章中看到的,恕我直言,国家机器的直接实现就足够了,或者可能是我错了?
答案 0 :(得分:4)
实现FSM最直接的方法是通过函数指针
在FSM中,定义了一个映射,它将事件和状态与特定行为相关联
因此,根据州的情况,应该区别对待同一事件。函数指针的使用是最合适的。
此外,它易于扩展。要添加新行为,只需添加新功能并更新新行为的映射表
它也可以扩展为具有多个状态机
我想可能还有其他“黑客”来实现FSM,但函数指针是标准化的方法。
答案 1 :(得分:3)
我会承认,那篇文章有点儿了;博士对我来说。但我要说的是,我在C中创建有限状态机的最简单,最优雅的方法之一是来自this post
这是一个snippit
#define FSM
#define STATE(x) s_##x :
#define NEXTSTATE(x) goto s_##x
FSM {
STATE(x) {
...
NEXTSTATE(y);
}
STATE(y) {
...
if (x == 0)
NEXTSTATE(y);
else
NEXTSTATE(x);
}
}
有些人可能会在任何情况下都不愿使用goto
,但我认为这是一个真正使用它的实现。
所以回答你的问题,是的,我不仅认为函数指针对于FSM来说可能过度,而且还会使代码混淆。
答案 2 :(得分:2)
首先,看看这个this answer,(在我看来)比你发布的那个更容易理解。
其次,你是对的:函数指针对于实现相同“事件模式”的不同行为很有用。这就是OOP中通常所说的多态性(看看this wikipedia article)。
所以,如果您考虑一下......这正是您对FSM所需要的:以不同的方式对同一事件做出反应,即:为您的FSM中的每个状态转换实现不同的功能。 / p>
乍一看,您可以说“经典”开关语句足以实现这一点,但灵活性和扩展函数指针实现的机会将奖励您长期。