我需要一些帮助来改变有限状态机中的状态。我的状态机的结构如下:
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时,程序崩溃。请帮助改变状态。
答案 0 :(得分:1)
自current_state
分配了name
后,它似乎是char
。但在switch
中,它被用作指向stateMachine
的指针。
答案 1 :(得分:1)
如果我正确解释您的代码,那么我会假设以下内容:
current_state = &(fsm[2]);
。我想你想指的是一个州而不是一个州的名字。printf("The current state now is %c\n",current_state->name);
。您也可以像这样定义结构,避免使用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
但要给它们命名 - 只需将状态的整数转换为人类可读的格式。