【问题标题】:Are function pointers really needed for implementing a FSM?实现 FSM 真的需要函数指针吗?
【发布时间】:2011-05-18 09:10:31
【问题描述】:
【问题讨论】:
标签:
c
data-structures
function-pointers
【解决方案1】:
实现 FSM 最直接的方法是通过函数指针。
在 FSM 中,定义了将事件和状态与特定行为相关联的映射。
所以根据不同的状态,同样的事件应该被区别对待。函数指针的用法最适合这个。
此外,它易于扩展。要添加新行为,您只需添加新函数并更新新行为的映射表即可。
它还可以扩展为拥有多个状态机。
我想可能还有其他“黑客”来实现 FSM,但函数指针是标准化的方法。
【解决方案2】:
我承认,那篇文章对我来说有点过头了。但我会说,我见过的用 C 创建有限状态机的最简单、最优雅的方法之一是来自 this post
这是一个片段
#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 来说可能是矫枉过正,而且它还容易混淆代码。
【解决方案3】:
首先,看看这个this answer,它(在我看来)比你发布的更容易理解。
其次,你是对的:函数指针对于为相同的“事件模式”实现不同的行为很有用。这就是 OOP 中通常所说的多态性(查看 this wikipedia article)。
所以,如果你想一想……这正是 FSM 所需要的:以不同的方式对同一事件做出反应,即:为 FSM 中的每个状态转换实现不同的功能。
乍一看,您可以说“经典” switch 语句就足以实现这一点,但从长远来看,扩展函数指针实现的灵活性和机会将为您带来回报。