需要有限状态机的指导

时间:2015-03-12 19:51:38

标签: c

我需要一些帮助来改变有限状态机中的状态。我的状态机的结构如下:

typedef struct stateMachine {

    char name;
    struct stateMachine *next0;
    struct stateMachine *next1;
}stateMac,*stateMac_p;

static stateMac_p current_state;

我想用* stateMac_p指向状态机的当前状态。 next0是进入0时的当前状态,next1是用户输入1时的当前状态。下面给出一个样本状态表:

A B C

B C D

C D A

我已经实现了状态机,并使用以下代码初始化状态:

{
    int i=0;

    for (i=0;i<3;i++)
        fsm[i].name=i+65;
    fsm[0].next0=(&(fsm[1]));
    fsm[0].next1=(&(fsm[2]));
    fsm[1].next0=(&(fsm[2]));
    fsm[1].next1=(&(fsm[3]));
    fsm[2].next0=(&(fsm[3]));
    fsm[2].next1=(&(fsm[0]));

//... and so on

    current_state = fsm[2].name;
}

执行程序时,首先打印当前状态并等待用户输入。我的问题是如何改变主要状态?例如,如果按下0,则应将当前状态更改为D.或者如果按下1,则应根据当前状态C和D A将状态更改为A作为下一状态。 我试图按照以下方式完成它,但它给了我错误。

case '0':
    current_state=current_state->next0;
    printf("The current state now is %c\n",current_state);

以及案例&#39; 1&#39;。

代码编译但按下0时,程序崩溃。请帮助改变状态。

3 个答案:

答案 0 :(得分:1)

current_state分配了name后,它似乎是char。但在switch中,它被用作指向stateMachine的指针。

答案 1 :(得分:1)

如果我正确解释您的代码,那么我会假设以下内容:

  1. 按如下方式更改作业:current_state = &(fsm[2]);。我想你想指的是一个州而不是一个州的名字。
  2. 应为printf("The current state now is %c\n",current_state->name);
  3. 您也可以像这样定义结构,避免使用switch语句:

    typedef struct stateMachine {
      char name;
      struct stateMachine *next[2];
    } stateMac, *stateMac_p;
    

    下一个状态(假设有效的输入字符c):

    current_state = current_state->next[c-48];
    

答案 2 :(得分:0)

只需拥有州的枚举

e.g

typedef enum {STATE_1 = 0, ..., WHATEVER_NAME_YOU_WANT, ...} States

这些基本上是整数。

然后编写一个函数将输入转换为从0到n的整数。

e.g。

int Convert(char c) { return c - 'A'; };

然后FSM就是一个2D阵列。有些元素永远不会看到光明之光

例如

typedef char Input; // Or whatever type for the input 

要从一种状态更改为另一种状态(例如)

State FSM[][] = {
  { STATE_1, STATE_2 },
  { FINAL, NO_REACHED }
};

然后运行它:

state = STATE_1;    while(state!= FINAL){       state = FSM [state] [ConvertInput()];    }

如果您在此示例中使用ConvertInput,则转换A-> 0,B-> 1

然后,这将根据正则表达式识别A * B

但要给它们命名 - 只需将状态的整数转换为人类可读的格式。