当前位置: 首页 > article >正文

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

三、运行结果

四、总结

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


http://www.kler.cn/a/377924.html

相关文章:

  • vue props无法被watch
  • 《AI产品经理手册》——解锁AI时代的商业密钥
  • 数据结构-自定义单链表
  • SQL拦截(二)InnerInterceptor
  • 常用的 Lambda 表达式案例解析
  • GO语言基础(三)
  • MySQL有关基础查询的知识点
  • Fetch 请求不支持取消操作的问题及解决方案
  • GaussDB和Oracle的语法对比
  • 使用RabbitMQ实现微服务间的异步消息传递
  • Java学习教程,从入门到精通,Java 循环结构:while 和 do...while(17)
  • 2024年 · 地表最强的十大遥感影像分割模型
  • Js内建对象
  • 10个领先的增强现实平台【AR】
  • uniapp 使用uni.getRecorderManager录音,wav格式采样率低于44100,音频播放不了问题解决
  • 无人机敏捷反制技术算法详解!
  • 同一个页面击穿element样式后,会影响同样组件的使用
  • C#与C++交互开发系列(二十):跨进程通信之共享内存(Shared Memory)
  • 论文阅读:Computational Long Exposure Mobile Photography (一)
  • [SICTF Round4] Crypto
  • 简易了解Pytorch中的@ 和 * 运算符(附Demo)
  • 图优化以及如何将信息矩阵添加到残差
  • 网络编程项目之UDP聊天室
  • 【书生.浦语实战营】——入门岛
  • 【OpenSearch】机器学习(Machine Learning)神经搜索教程
  • 【Android】View的事件分发机制