实现FSM真的需要函数指针吗?

时间:2010-12-01 08:57:29

标签: c data-structures function-pointers

我在文章中稍后阅读了http://www.netrino.com/Embedded-Systems/How-To/State-Machines-Event-Driven-Systems,他们用C语言提供了小型FSM的实现。

我不太明白为什么他们选择了函数指针。在我的理解中,当需要相同的接口时,指向函数的指针是有用的,但是对于不同类型的“事件”,例如解析一些Internet协议包(方便地将一个指针注册到函数并为其分配不同的函数,一个解析) HTTP,第二个解析FTP等等。这只是一个例子,但我认为你明白了我的观点。)

但这不是我在文章中看到的,恕我直言,国家机器的直接实现就足够了,或者可能是我错了?

3 个答案:

答案 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>

乍一看,您可以说“经典”开关语句足以实现这一点,但灵活性和扩展函数指针实现的机会将奖励您长期。