显然,boost包含两个独立的状态机库:Statechart和Meta State Machine(MSM).标语给出了非常相似的描述:
你知道两者之间的主要区别和选择考虑因素是什么?
我们需要在C中实现一个简单的状态机.
标准的switch语句是最好的方法吗?
我们有一个当前状态(状态)和转换触发器.
switch(state)
{
case STATE_1:
state = DoState1(transition);
break;
case STATE_2:
state = DoState2(transition);
break;
}
...
DoState2(int transition)
{
// Do State Work
...
if(transition == FROM_STATE_2) {
// New state when doing STATE 2 -> STATE 2
}
if(transition == FROM_STATE_1) {
// New State when moving STATE 1 -> STATE 2
}
return new_state;
}
Run Code Online (Sandbox Code Playgroud)
对于简单的状态机是否有更好的方法
编辑:对于C++,我认为Boost Statechart库可能是要走的路.但是,它对C 没有帮助.让我们专注于C用例.
我只是想知道是否有人知道在互联网上开发状态机的一些很好的教程.还是电子书?
我开始在状态机上工作,只需要一些通用的东西让我开始.
与此Stack Overflow问题(C状态机设计)相关,Stack Overflow人员可以与我(以及社区)共享您的Python状态机设计技术吗?
目前,我正在寻找基于以下内容的引擎:
class TrackInfoHandler(object):
def __init__(self):
self._state="begin"
self._acc=""
## ================================== Event callbacks
def startElement(self, name, attrs):
self._dispatch(("startElement", name, attrs))
def characters(self, ch):
self._acc+=ch
def endElement(self, name):
self._dispatch(("endElement", self._acc))
self._acc=""
## ===================================
def _missingState(self, _event):
raise HandlerException("missing state(%s)" % self._state)
def _dispatch(self, event):
methodName="st_"+self._state
getattr(self, methodName, self._missingState)(event)
## =================================== State related callbacks
Run Code Online (Sandbox Code Playgroud)
但我确信在利用Python的动态特性(例如动态调度)的同时,还有很多方法可以实现.
我正在接受"引擎"的设计技术,它接收基于机器"状态"的"事件"和"发送".
我手边有一个问题,我没有得到使用哪种设计模式.问题是这样的:
我必须构建一个具有'N'状态的系统,并且我的系统必须根据某些条件从任何状态转换到任何其他状态.例如:在条件1下,从状态1移动到3,在条件2上从状态1移动到4.
甚至从一个状态到另一个状态的转换也可以在两个或更多个不同的条件下完成.
例如,从状态1到状态3的转换可以在以下
情况下完成:条件1:"它是星期日"
条件2:"它的下雨"
条件3:"它的下雨和星期日"
在每种情况下,状态3的处理可以是不同.
我希望我能够清楚地理解这个问题.请帮助.
非常感谢
在C中编写状态机的最佳方法是什么?
我通常在for(;;)中编写一个大的switch-case语句,并在外部操作完成时使用回调来重新进入状态机.
你知道更有效的方式吗?
有限状态机通常被认为是OOP中的糟糕设计吗?
我听到了很多.并且,在我不得不使用一个非常古老的,没有文档的C++片段之后,我倾向于同意.调试很痛苦.
可读性/可维护性问题呢?
我正在寻找一种方法来混淆(在目标代码中)一个测试 - 就像检查许可证密钥是否有效一样.我想要防止的是有人在图像二进制文件中搜索处理响应的代码.
bool checkError = foo();
if ( checkError ) // I'd like to avoid making a simple check like this one.
{
// process response
}
Run Code Online (Sandbox Code Playgroud)
这是一个简单的例子,但不是推荐的方法:
int check = 71 * 13;
check += 35 * isValid(); // will only return 0 or 1
//later (delayed execution of response)
if ( check % 71 )
{
//process response
}
Run Code Online (Sandbox Code Playgroud)
编辑:只是为了澄清,实际测试已经完成,我正在通过/失败返回.我的响应处理将是一个基本的jmp,并且会对如何混淆jmp位置的指针感兴趣.
我想编写一个以空闲状态开始的FSM,并根据某个事件从一个状态移动到另一个状态.我不熟悉FSM的编码,谷歌没有帮助.感谢是否有人可以发布可用于相同的C数据结构.
谢谢,syuga2012