C语言实现有限状态机FSM

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;
}
}

#include int main() { int state_key = 1; //钥匙状态 为1时钥匙区有钥匙,为时钥匙区 无钥匙 int state_hold = 0; // 钥匙持有状态 为1时持有钥匙,为时 未持有钥匙 int state_door = 0; //门状态 0:关闭 1:打开 int state_lock = 1; //上锁状态 1:上锁 0:解锁 int order; // 用于存放用户输入指令 printf("this is a game.\n"); printf ("if you want to OPEN THE DOOR ,input 1\n"); printf ("if you want to CLOSE THE DOOR ,input 2\n"); printf ("if you want to LOCK THE DOOR ,input 3\n"); printf ("if you want to UNLOCK THE DOOR,input 4\n"); // printf ("if you want to LOCK THE DOOR ,input 5\n"); printf("please input the order\n"); while(1) { scanf("%d",&order); // if(order!=(1||2||3||4)) // { // printf("worng input ,please input again.\n"); // continue; // } switch(order) { case 1 : if(state_door==1) { printf("the door has been opened before\n"); break; } if(state_lock==1) { printf("the door has been lock\n"); break; } state_door=1; break; case 2: if(state_door==0) { printf("the door has been closed before\n"); break; } if(state_lock==1) { printf("the door has been lock\n"); break; } state_door=0; break; case 3: if(state_door==1) { printf("the door has been opened before\n"); break; } if(state_lock==1) { printf("the door has been lock\n"); break; } state_lock=1; break ; case 4: if(state_door==1) { printf("the door has been opened before\n"); break; } if(state_lock==0) { printf("the door has not been lock\n"); break; } state_lock=0; break ; } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值