首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >FSM状态的实现技术

FSM状态的实现技术
EN

Stack Overflow用户
提问于 2010-06-21 11:20:47
回答 5查看 532关注 0票数 1

如何实现FSM(编辑:有限状态机)状态?我通常会想到一个FSM,比如一组函数、一个调度程序和一个线程来指示当前的运行状态。也就是说,我会阻止对表示状态的函数/函子的调用。

刚才我已经用不同的方式实现了一个,我仍然用函数(对象)表示状态,但是线程只是调用一个state->step()方法,该方法试图尽快返回。如果状态已经完成,并且应该进行过渡,则表示相应地。我将其称为“轮询”风格,因为这些函数主要是这样的:

代码语言:javascript
复制
void step()
{
  if(!HaveReachedGoal)
  {
    doWhateverNecessary();
    return; // get out as fast as possible
  }
  // ... test perhaps some more subgoals
  indicateTransition();
}

我知道这是密克罗尼西亚联邦内部的一个密克罗尼西亚联邦。

这感觉相当简单,但也有一定的优势。虽然被阻塞的线程,或者在某种类型的while (!CanGoForward)checkGoForward();循环中持有的线程可能很麻烦和难以处理,但是轮询更容易调试。这是因为FSM对象在每一步之后都恢复控制,并且发布一些调试信息是很容易的。

那么,我偏离了我的问题:如何实现FSM的状态?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-06-21 11:33:08

状态设计模式是实现FSM的一种有趣的方法:

模式

这是实现FSM的一种非常干净的方式,但它可能会很混乱,取决于FSM的复杂性(而不是状态的数量)。然而,其优点是:

  • 您可以消除代码重复(特别是if/else语句)
  • 使用新的状态更容易扩展。
  • 您的类具有更好的内聚性,所以所有相关的逻辑都在一个地方--这也会使您的代码更容易编写测试。

在这个站点上有一个Java和C++实现:

http://www.vincehuston.org/dp/state.html

票数 1
EN

Stack Overflow用户

发布于 2010-06-21 11:28:17

我总是把飞天派怪物的实现FSMs (FSM风格FSM)的风格称为:使用lotsa gotos。例如:

代码语言:javascript
复制
state1:
  do_something();
  goto state2;

state2:
  if (condition) goto state1;
  else           goto state3;

state3:
  accept;

非常好的意大利面代码:-)

票数 1
EN

Stack Overflow用户

发布于 2010-06-21 11:28:22

我把它作为一个表,内存中的一个平面数组,每个单元格都是一个状态。请看一看废弃的DFA项目的cvs源。对于示例

代码语言:javascript
复制
class DFA {
    DFA();
    DFA(int mychar_groups,int mycharmap[256],int myi_state);
    ~DFA();
    void add_trans(unsigned int from,char sym,unsigned int to);
    void add_trans(unsigned int from,unsigned int symn,unsigned int to);
    /*adds a transition between state from to state to*/
    int add_state(bool accepting=false);
    int to(int state, int symn);
    int to(int state, char sym);
    void set_char(char used_chars[],int);
    void set_char(set<char> char_set);
    vector<int > table; /*contains the table of the dfa itself*/
    void normalize();

    vector<unsigned int> char_map;
    unsigned int char_groups; /*number of characters the DFA uses,
                    char_groups=0 means 1 character group is used*/
    unsigned int i_state; /*initial state of the DFA*/
    void switch_table_state(int first,int sec);
    unsigned int num_states;
    set<int > accepting_states;
};

但是这是为了一个非常特殊的需求(匹配正则表达式)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3084157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档