查看原文
其他

一种C语言高效率的状态机的实现

bug菌 最后一个bug 2022-10-14
    /***习惯跟大家聊一聊***/
   非常感谢短短的几天增加了许多人的关注,本公众号也是作者的第一个公众号,运营应该大概一个月不到吧!作者从事嵌入式开发多年积累了较多相关经验,尽量为大家带来比较常用和精华的知识和经验,同时作者在学校参加过多类竞赛,都取得了不错的成绩,能够为目前在校的大学生提供较好的建议、学习方法和学习资源,本公众号的风格不会粘贴太多的代码,而是多以思想和方法传递给大家!
    同时也希望大家能把相关知识分享出去,能够给其他人也有一些小小的帮助,大家有什么疑问也可以多跟我留言或者私信,我都尽量第一时间回复大家!好了,不矫情了,下面进行我们的重点内容,一种高效率的c语言状态机!
    /***高效率状态机***/
    状态机对于有一定编程经验的程序员一定会用到,因为对于我们的各种各样的模块他们都会有各种状态,其他模块都会根据这些状态和数据进行处理;同时在网络编程方面也会根据网络状态和消息类型进行相应处理等等方面状态机的使用是非常广泛的,我们通常称这种状态机为有限状态机—FSM。
      在进行有限状态机编写之前,我们需要进行状态的梳理,最好是能画UML图或者是简单的画一些状态图,那么我们平时都是如何实现这个状态机框架的呢?
      1)用判断语句进行状态机的分支
         if(statue == STATUE_1)sStatue1Process();
         else if(statue == STATUE_2)sStatue2Process();
         else if(statue == STATUE_3)sStatue3Process();
         else sStatue4Process();
      上面通过if/else分支了4种状态,分别每种状态有各自的处理办法process函数,那么状态之间如何转换呢?在我们的状态处理函数里面,会通过处理当前状态的相关事务,然后通过相关条件改变statue,如statue=STATUE_2,从而下一次进入对应的状态中!
      那么上面我们是通过分支来进行处理,同样我们也可以使用switch来进行处理!至于选择if/else还是switch,我们之前有个文章进行分析,大家可以前往阅读,这两种分支语句对于不太多的状态仍然是首选的,而对于我们的状态较多,那么可能通过判断会浪费一些时间,为了提高效率,我们提出了第二种方法。
      2)用函数指针高效提高状态机效率
      参考代码如下:

    按照预期输出了最终的结果,该办法类似于用空间换了时间,把状态和处理进行了直接绑定,这样会使用掉一些内存,不过对于整个软件代码而言是不值一提的!
      优化:我们可能对于状态处理还需要传入一些数据,我们可以优化函数指针让其变成含参数的形式!等等优化版本大同小异!(哈哈,上面的代码手机打得,风格写得不好大家请见谅)
       好了,这里是公众号"最后一个bug",感谢大家的关注,也希望大家有时间能分享转发!你们的关注是我最大的动力!哈哈,下期见!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存