关于状态机的定义已经比较模糊了
大致猜一下 有限状态机是指 起始结点到终点之间存在有限个数的状态。
通过这些状态之间的跳转可以简单的对付复杂的输入
在实际应用中,许多状态特性明显或者不明显的都能划分出状态机
特别是面向对象思想应用到编程中,状态的意义越来越明显
下面要谈到的程序实现来自一个简单的dhcp客户端的实现代码
由于dhcp有多个状态:
discovery offer decline request 等等等等这些都是dhcp协议的状态
当然实际编码中,应该划分更接近实现的状态
划分完成后,每一种状态应该对应一个处理流程,处理流程不论是正常结束还是错误结束都应该跳转到其他状态上。
本例子中,程序员巧妙的运用函数指针来实现状态的跳转
1.每个状态对应处理流程函数都定义如下形式
void *process_1();
void *process_2();
.............
2.而状态机的启动和运行有赖于下面代码
void *(*currState)() = &process_m;
do{
if ( (currState=(void *(*)())currState()) == NULL ) exit(1);
}while ( currState != &process_k );
或者
do{
currState=(void *(*)())currState();
} while ( currState );
3.在每个状态的处理流程中,要么返回一个状态,要么返回NULL
大致猜一下 有限状态机是指 起始结点到终点之间存在有限个数的状态。
通过这些状态之间的跳转可以简单的对付复杂的输入
在实际应用中,许多状态特性明显或者不明显的都能划分出状态机
特别是面向对象思想应用到编程中,状态的意义越来越明显
下面要谈到的程序实现来自一个简单的dhcp客户端的实现代码
由于dhcp有多个状态:
discovery offer decline request 等等等等这些都是dhcp协议的状态
当然实际编码中,应该划分更接近实现的状态
划分完成后,每一种状态应该对应一个处理流程,处理流程不论是正常结束还是错误结束都应该跳转到其他状态上。
本例子中,程序员巧妙的运用函数指针来实现状态的跳转
1.每个状态对应处理流程函数都定义如下形式
void *process_1();
void *process_2();
.............
2.而状态机的启动和运行有赖于下面代码
void *(*currState)() = &process_m;
do{
if ( (currState=(void *(*)())currState()) == NULL ) exit(1);
}while ( currState != &process_k );
或者
do{
currState=(void *(*)())currState();
} while ( currState );
3.在每个状态的处理流程中,要么返回一个状态,要么返回NULL