状态机最适合哪种编程问题?
我已经阅读过有关使用状态机实现的解析器,但是想了解一些尖叫出来作为状态机实现的问题.
最简单的答案可能是他们几乎适合任何问题.不要忘记计算机本身也是状态机.
无论如何,状态机通常用于存在某些输入流的问题,并且在给定时刻需要完成的活动取决于该点处在该流中看到的最后元素.
此输入流的示例:解析时的某个文本文件,正则表达式的字符串player entered room
,游戏AI等事件等.
活动的例子:准备好读取一个数字(在另一个数字后跟一个+
已出现在计算器解析器的输入中),转身(在玩家接近然后打喷嚏之后),执行跳跃踢(在玩家向左压,左,右,上,上).
这个免费的State Machine EBook是一个很好的资源.我自己的快速回答如下.
当您的逻辑必须包含有关上次运行时发生的事件的信息时,它必须包含状态.
因此,状态机只是记住(或作用于)信息的任何代码,只有通过了解之前发生的事情才能获得这些信息.
例如,我有一个我的程序必须使用的蜂窝调制解调器.它必须按顺序执行以下步骤:
重置调制解调器
启动与调制解调器的通信
等待信号强度表明与塔的良好连接
...
现在我可以阻止主程序,只需按顺序完成所有这些步骤,等待每个步骤运行,但我想给我的用户反馈并同时执行其他操作.所以我将它实现为函数内的状态机,并且每秒运行100次这个函数.
enum states{reset,initsend, initresponse, waitonsignal,dial,ppp,...} modemfunction() { static currentstate switch(currentstate) { case reset: Do reset if reset was successful, nextstate=init else nextstate = reset break case initsend send "ATD" nextstate = initresponse break ... } currentstate=nextstate }
更复杂的状态机实现协议.例如,我使用的ECU诊断协议只能发送8字节数据包,但有时我需要发送更大的数据包.ECU很慢,所以我需要等待响应.理想情况下,当我发送消息时,我使用一个函数然后我不关心会发生什么,但在某个地方,我的程序必须监视该行并发送和响应这些消息,将它们分成更小的部分并将接收到的消息重新组合成最后的消息.