介绍一种高效率的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)用函数指针高效提高状态机效率      

参考代码如下:

状态机

状态机

状态机

按照预期输出了最终的结果,该办法类似于用空间换了时间,把状态和处理进行了直接绑定,这样会使用掉一些内存,不过对于整个软件代码而言是不值一提的!      

优化:我们可能对于状态处理还需要传入一些数据,我们可以优化函数指针让其变成含参数的形式!等等优化版本大同小异!(哈哈,上面的代码手机打得,风格写得不好大家请见谅)


审核编辑:刘清


 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分