3

在被困在一些 c**p SM 代码中时,我最终想知道是否有状态机的名称可以执行导致进一步输入的操作?例如,转换操作Start--(PowerOn)-->Initialized 可能会导致Play生成,然后状态机将 Play 作为输入并执行转换Initialized--(Play) -->Playing。所以我有点需要这种机器的名称,这样我就可以把它变成我认为的普通 SM(又名 SM,它根据输入进行转换,只要它们不结束,ofc 对转换的操作也可以影响输入)。

这太抽象了:我有一个发送和接收消息的“SM”,问题是发送部分会导致回复,而不是作为输入处理。这使得很难推断机器的行为,这反过来又使得修改代码变得困难。

4

2 回答 2

3

它们被命名为:

递归状态机 (RSM)。

更多信息见http://research.microsoft.com/en-us/um/people/pg/public_psfiles/toplas2005.pdf

于 2012-11-23T18:51:15.733 回答
0

如果您担心状态机递归调用自身,那么如何:

按照我在评论中链接的文章中的建议实现状态机,您将拥有一个 Moore 风格的输出函数、一个 Mealy 风格的输出函数、一个转换函数和一个下一状态确定函数。

然后,您可以将其与Ambroz Bizjak长堆栈溢出帖子较短(但更简洁)的programmers.stackexchange帖子中描述的排队技术结合起来,将传入的输入排队到机器,然后让机器转换函数循环和阻塞等待此队列中的输入。机器的所有输入都应该排队进入队列,而不是直接调用转换函数;这样,任何会导致新输入发生的输出都会将输入排队,而不是进行递归转换调用。

您也可以尝试将您的机器拆分为发送机器和接收机器,然后有一种u结构:

   input        output
     |             ^
     v             |
+---------+   +---------+
|   rx    |   |   tx    |
| machine |-->| machine |
+---------+   +---------+

这将有助于将逻辑分开一点。这在过去对我有用。

至于这个场景的名字?我一个都不知道。

于 2012-11-19T21:59:41.137 回答