【问题标题】:Are function pointers really needed for implementing a FSM?实现 FSM 真的需要函数指针吗?
【发布时间】:2011-05-18 09:10:31
【问题描述】:

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

我不太明白他们为什么选择函数指针。在我的理解中,当需要相同的接口,但对于不同类型的“事件”时,函数指针很有用,例如解析一些互联网协议数据包(注册一个函数指针并为其分配不同的函数很方便,一个解析HTTP,其次是解析 FTP 等等。这只是一个例子,但我想你明白了我的意思)。

但这不是我在文章中看到的,恕我直言,状态机的直接实现就足够了,还是我错了?

【问题讨论】:

    标签: 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 语句就足以实现这一点,但从长远来看,扩展函数指针实现的灵活性和机会将为您带来回报。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-08-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-14
          相关资源
          最近更新 更多