欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 社会 > C语言另一种编码方式开发状态机(无switch)

C语言另一种编码方式开发状态机(无switch)

2024/11/8 4:57:18 来源:https://blog.csdn.net/qq_36075612/article/details/143471251  浏览:    关键词: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;
}

三、运行结果

四、总结

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com