目录
概述
一、开发环境
二、coding
三、运行结果
四、总结
概述
状态机编码思想,在很多领域都随处可见,传统的coding方式使用switch + case来实现,状态跳转可读性差,咋们换一种思路来实现状态机开发,该方式 拓展好、编写复杂的场景等优点。
一、开发环境
visual studio 22
二、coding
#include <iostream>typedef struct FsmHandle
{int state_id; //< 状态ID定义}Fsm;enum {FS_StatusA = 0, //< 状态A FS_StatusB, //< 状态B FS_StatusC, //< 状态C FS_StatusD, //< 状态D FS_StatusMax,
}FsmStatus;typedef void (*FsmHandler)(Fsm* fsm);static void handler_status_a(Fsm* fsm)
{printf("process status A... \n");// 执行相关的逻辑// do something...// 切换状态fsm->state_id = FS_StatusB;
}static void handler_status_b(Fsm* fsm)
{printf("process status B... \n");// 执行相关的逻辑// do something...// 切换状态fsm->state_id = FS_StatusC;
}static void handler_status_c(Fsm* fsm)
{printf("process status C... \n");// 执行相关的逻辑// do something...// 切换状态fsm->state_id = FS_StatusB;
}static void handler_status_d(Fsm* fsm)
{printf("process status D... \n");// 执行相关的逻辑// do something...// 切换状态fsm->state_id = FS_StatusA;
}/*** breif 定义状态处理表*/
static const FsmHandler c_status_handler[FS_StatusMax] = {handler_status_a,handler_status_b,handler_status_c,handler_status_d,
};int FsmInit(Fsm* fsm)
{// 安全检查 // 初始化逻辑fsm->state_id = FS_StatusA;return 0;
}int FsmDeInit(Fsm* fsm)
{// 安全检查 return 0;
}void FsmRunOnce(Fsm* fsm)
{// 安全检查 c_status_handler[fsm->state_id](fsm);
}bool g_is_working = true;static Fsm m_fsm = { 0 };int main()
{int result = -1;result = FsmInit(&m_fsm);// 执行结果检查if (result) {return 0;}while (g_is_working) {FsmRunOnce(&m_fsm);}FsmDeInit(&m_fsm);return 0;
}
三、运行结果
四、总结
好了,就介绍到此为止,希望能帮助到需要的人。