用C语言编写状态机的最佳方法是什么?
我通常在for(;;)中编写一个大的switch case语句,并在外部操作完成时回调以重新进入状态机。
你知道更有效的方法吗?
最佳答案
我喜欢Quantum Leaps方法。
当前状态是指向以事件对象为参数的函数的指针。当一个事件发生时,只需用该事件调用state函数;然后,该函数就可以完成工作并通过将状态设置为另一个函数来转换到另一个状态。
例如。:
// State type and variable, notice that it's a function pointer.
typedef void (*State)(int);
State state;
// A couple of state functions.
void state_xyz(int event) { /*...*/ }
void state_init(int event) {
if (event == E_GO_TO_xyz) {
// State transition done simply by changing the state to another function.
state = state_xyz;
}
}
// main contains the event loop here:
int main() {
int e;
// Initial state.
state = state_init;
// Receive event, dispatch it, repeat... No 'switch'!
while ((e = wait_for_event()) != E_END) {
state(e);
}
return 0;
}
QL框架为输入/退出/ init操作、层次状态机等额外的事物提供帮助。我强烈推荐the book以进行更深层次的解释和良好的实现。