C语言另一种编码方式开发状态机(无switch)
目录
概述
一、开发环境
二、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;
}
三、运行结果
四、总结
好了,就介绍到此为止,希望能帮助到需要的人。