虽然卡在一些c ** p SM代码中我最后想知道是否有状态机的名称执行导致进一步输入的操作?
例如,有关转换的行动Start--(PowerOn)-->Initialized
可能会导致生成Play
,并且状态机会将Play作为输入并执行转换Initialized--(Play) -->Playing
。
所以我需要这种机器的名称,所以我可以把它变成我认为正常的SM(也就是根据输入进行转换的SM,转换时的ofc动作也可以,只要它们不会结束影响输入)。
这太抽象了:我有一个发送和接收消息的“SM”,问题是发送部分会导致作为输入处理的回复。这使得很难推断机器的行为,这反过来又使代码的修改变得困难。
答案 0 :(得分:3)
他们被命名为:
递归状态机(RSM)。
更多信息请参阅http://research.microsoft.com/en-us/um/people/pg/public_psfiles/toplas2005.pdf
答案 1 :(得分:0)
如果您担心状态机会以递归方式调用自身,那么这个怎么样:
按照我在评论中链接的文章中的建议实现状态机,你有一个Moore风格的输出函数,一个Mealy风格的输出函数,一个转换函数和一个下一个状态的确定功能
然后,您可以将其与Ambroz Bizjak或long stack overflow post中的shorter (but somewhat more concise) programmers.stackexchange post所描述的排队技术相结合,以将输入排入机器,然后让机器转换函数循环并阻止等待此队列中的输入。机器的所有输入都应排队到队列中,而不是直接调用转换函数;这样,任何会导致新输入发生的输出都会对输入进行排队,而不是进行递归转换调用。
您也可以尝试将您的计算机拆分为传输计算机和接收计算机,然后使用某种u
结构:
input output
| ^
v |
+---------+ +---------+
| rx | | tx |
| machine |-->| machine |
+---------+ +---------+
这有助于将逻辑分开一点。这对我来说过去很有用。
这个场景的名称是什么?我不知道。