请教各位大侠,能否给我说说状态机(FSM)的一个简单过程?

justlearning 2003-08-19 08:26:18
能否举个简单的例子?谢谢。
比如,下面这个函数是怎么回事?

/***********************************
* FSM state dispatch table
************************************
*/
static void (*DispatchTable[NUM])
(task *pa, personal *pb) =
{
state_00,
state_01,
state_02,
state_03,
state_04,
};

...全文
48 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
justlearning 2003-08-20
  • 打赏
  • 举报
回复
多谢各位,
终于明白了,呵呵。马上给分。
cdxiaogan 2003-08-20
  • 打赏
  • 举报
回复
编译原理的词法分析实例,运用DFA技术:
http://expert.csdn.net/Expert/topic/1899/1899340.xml?temp=.7674219
相关状态转换图:
http://www.erping.com/bbs/usr/6/6_76.gif
justlearning 2003-08-20
  • 打赏
  • 举报
回复
多谢各位大侠热心指教,呵呵。
Wendydd 2003-08-19
  • 打赏
  • 举报
回复
你这个例子也差不多

/***********************************
* FSM state dispatch table
************************************
*/
static void (*DispatchTable[NUM])
(task *pa, personal *pb) =
{
state_00,
state_01,
state_02,
state_03,
state_04,
};

state_00, state_01, state_02, state_03, state_04 就是几个状态机,不过没有写成对象的形式。是用几个过程表示的,一般实现一个状态向另一个状态的转换。
Wendydd 2003-08-19
  • 打赏
  • 举报
回复
例子啊
到是前几天刚刚写了一个
不过写得很难看 :(

题目:设计一个程序,实现判别一个0,1构成的字串,被3整除后的余数。

算法:设:S0为所有余0的字串的集合,S1为所有余1的字串的集合,S2为所有余2的字串的集合。起始设置X=0 ,当X后再输入0时,该数仍属于S0;当X后再输入1时,该数属于S1。当X属于S1时,X后再输入0时,该数属于S2;X后再输入1时,该数属于S0。当X属于S2时,X后再输入0时,该数属于S1;X后再输入1时,该数属于S2。

将算法化为表格(2×3的矩阵):行表示S0,S1,S2 列表示输入的数0,1 行列的交叉为该数属于的集合S0,S1,S2,表示余0,1,2

0 1
S0 S0 S1
S1 S2 S0
S2 S1 S2


#include <iostream>
#include <string>

using namespace std;

/////////////////////////////
// class decaration
/////////////////////////////
class StateMachine
{
public:
virtual StateMachine* change(char ch) = 0;
virtual int result() = 0;

static int parse(string bin);
};

class MachineS0 : public StateMachine
{
public:
StateMachine* change(char ch);
int result() { return 0; }
};

class MachineS1 : public StateMachine
{
public:
StateMachine* change(char ch);
int result() { return 1; }
};

class MachineS2 : public StateMachine
{
public:
StateMachine* change(char ch);
int result() { return 2; }
};

class MachineError : public StateMachine
{
public:
StateMachine* change(char ch);
int result() { return -1; }
};

/////////////////////////////
// class definition
/////////////////////////////
int
StateMachine::parse(string bin)
{
StateMachine *sm = new MachineS0();

for (int i = 0; i < bin.length(); ++i) {
StateMachine *tmp = sm->change(bin[i]);

delete sm;
sm = tmp;

if ( -1 == sm->result())
return -1;
}

int result = sm-> result();
delete sm;

return result;
}

StateMachine*
MachineS0::change(char ch)
{
switch (ch) {
case '0': return new MachineS0();
case '1': return new MachineS1();
default : return new MachineError();
}
}

StateMachine*
MachineS1::change(char ch)
{
switch (ch) {
case '0': return new MachineS2();
case '1': return new MachineS0();
default : return new MachineError();
}
}

StateMachine*
MachineS2::change(char ch)
{
switch (ch) {
case '0': return new MachineS1();
case '1': return new MachineS2();
default : return new MachineError();
}
}

StateMachine*
MachineError::change(char ch)
{
return new MachineError();
}

/////////////////////////////
// Test
/////////////////////////////
int main(int argc, char** argv)
{
cout << StateMachine::parse("0") << endl;
cout << StateMachine::parse("1") << endl;
cout << StateMachine::parse("10") << endl;
cout << StateMachine::parse("01") << endl;
cout << StateMachine::parse("110") << endl;
cout << StateMachine::parse("101") << endl;
cout << StateMachine::parse("111") << endl;
cout << StateMachine::parse("1011010010100101") << endl;
cout << StateMachine::parse("2110") << endl;
cout << StateMachine::parse("a110") << endl;

system("PAUSE");
return 0;
}
aflyinghorse 2003-08-19
  • 打赏
  • 举报
回复
static void (*DispatchTable[NUM])(task *pa, personal *pb);
DispatchTable是指针数组,数组的元素是函数指针,即state_00,state_01,state_02,state_03,state_04,

这些函数的返回值为void,参数为task *pa, personal *pb

64,318

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧