FSM(finite state machine),它是一种协议,是一个数学概念,用于有限数量的子程序(状态)的变化,每个子程序进行一些处理并选择下一种状态(通常取决于下一段输入);
它可以用作程序的控制,对于那些基于输入的在几个不同的可选动作中进行循环的程序尤为合适。
C语言中的状态机表达式通常使用函数指针数组的方式。
void (*state[MAX_STATES] ) ( );
extern int a(), b(), c(), d(),
int (*state[ ] ) () = {a, b, c, d };
正便可以通过数组指针调用函数:( *state[ i ] ) ( );
甚至可以调用写成: state[ i ] ( );
调用函数和通过指针调用函数可以使用同一种语法,这事ANSI C的一个不良方法。进一步恶化了“声明和使用相似”的设计哲学。
其实我们可以:
- 让状态函数返回一个指向通用后续函数的指针,并把它转化为适当的类型,这样就不需要全局变量了。
- 使用switch语句作为一种简朴的状态机,方法是赋值给控制变量并把switch语句放在循环内部。
- 如果状态函数看上去需要多个不同的参数,可以考虑使用一个参数计数器和一个字符串指针数组,像main函数参数一样。我们熟悉的int argc,char * argv[ ].
enum FSM_STATE {
STATE1 = 1,
STATE2 = 2,
STATE3 = 3,
};
FSM_STATE fsmStatus = STATE1;
void fsm(void){
switch( fsmStatus)
{
case STATE1:
break;
case STATE2:
break;
case STATE3:
break;
}
}