目录
概述
一、开发环境
二、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;
}三、运行结果

四、总结
好了,就介绍到此为止,希望能帮助到需要的人。



















