gpt4 book ai didi

c - C中的状态机实现

转载 作者:太空宇宙 更新时间:2023-11-04 07:55:53 26 4
gpt4 key购买 nike

我一直在尝试用 C 语言实现一个状态机,但我不是确定我的实现是否合适。我试图以伪对象的方式实现状态图。所以我在 StateMachine.h 头文件中声明了 StateMachine“类”的公共(public)接口(interface):

typedef enum{
STATE_01,
STATE_02,
STATE_03,
STATE_04
}state_e;

typedef enum{
NO_EVENT,
EVENT_01,
EVENT_02,
EVENT_03,
EVENT_04,
EVENT_05,
EVENT_06,
EVENT_07
}event_e;

// state machine instance
typedef struct{
state_e currState;
}StateMachine;

extern void InitState(StateMachine*);
extern void ProcSTATE_01(StateMachine*, event_e);
extern void ProcSTATE_02(StateMachine*, event_e);
extern void ProcSTATE_03(StateMachine*, event_e);
extern void ProcSTATE_04(StateMachine*, event_e);
extern void ProcEvent(StateMachine*, event_e);

StateMachine 对象“方法”的实现在 StateMachine.c 模块中:

void InitState(StateMachine *sm)
{
sm->currState = STATE_01;
}


void ProcSTATE_01(StateMachine *sm, event_e event)
{
if(event == EVENT_01){
sm->currState = STATE_02;
}
}

void ProcSTATE_02(StateMachine *sm, event_e event)
{
// ...
}

void ProcSTATE_03(StateMachine *sm, event_e event)
{
// ...
}

void ProcSTATE_04(StateMachine *sm, event_e event)
{
// ...
}


void ProcEvent(StateMachine *sm, event_e event)
{
switch(sm->currState){
case STATE_01:
ProcSTATE_01(sm, event);
break;

case STATE_02:
ProcSTATE_02(sm, event);
break;

case STATE_03:
ProcSTATE_03(sm, event);
break;

case STATE_04:
ProcSTATE_04(sm, event);
break;

}
}

StateMachine 对象的用法如下:

int main(int argc, char** argv) {

StateMachine app;
ProcEvent(&app, EVENT_01);

return 0;
}

我想问问更有经验的人,他是否能看到与此实现相关的任何潜在问题。感谢您提出任何意见。

最佳答案

您需要考虑事件的来源。它们是仅从状态转换处理程序本身生成的,还是外生的。如果它们是外生的,那么您可能需要处理程序外部的事件循环,它从队列中提取事件并将它们注入(inject)适当的处理程序(这可能会将另一个事件排入队列以供以后处理)。此外,您可能希望将状态事件处理函数存储在一个数组中(以状态编号为索引),以便您可以通过编程方式调用它们(而不必使用巨大的 switch 语句)。

关于c - C中的状态机实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50172112/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com