表驱动的自动状态机(FSM)

    技术2026-06-18  10

    // 表驱动的自动状态机(FSM)// VC2008

    #include "stdafx.h"#include <map>

    // 状态enum enState{ enState_Open, enState_Close,

     // 数量 enState_Num};

    // 输入事件enum enEvent{ enEvent_Open, enEvent_Close,

     // 数量 enEvent_Num};

    // 状态转换表struct FSM_Transition{ enState m_curState; enEvent m_Event; enState m_NextState;};

    // 状态机class FSM{public: // 初始状态 FSM(enState s0) : m_curState(s0) {};

     // 设置状态转换表 void ClearTrans() { m_TransTable.clear(); }; void AddTrans(const FSM_Transition& trans) {  TransTableKey key = std::make_pair(trans.m_curState, trans.m_Event);  TransTable::iterator it_find =  m_TransTable.find(key);  if(it_find != m_TransTable.end())  {   if(trans.m_curState != trans.m_NextState)   {    it_find->second = trans.m_NextState;   }   else   {    m_TransTable.erase(it_find);   }  }  else if(trans.m_curState != trans.m_NextState)  {   m_TransTable.insert( std::make_pair(key, trans.m_NextState) );  } }

     // 状态转换函数 bool HandleEvent(enEvent enE) {  enState prevState = m_curState;  TransTableKey key = std::make_pair(prevState, enE);  TransTable::iterator it_find =  m_TransTable.find(key);  if(it_find != m_TransTable.end())  {   m_curState = it_find->second;  }  OnStateChange(prevState, enE, m_curState);  return (prevState != m_curState); }

     // 终止状态 bool IsFinal() const {  return (m_curState == enState_Close); }

    protected: // 状态转换事件 void OnStateChange(enState prevState, enEvent enE, enState curState) {};

    private: enState m_curState; typedef std::pair<enState, enEvent> TransTableKey; typedef std::map<TransTableKey, enState> TransTable; TransTable m_TransTable;};

    int _tmain(int argc, _TCHAR* argv[]){

     FSM_Transition trans[] = {  {enState_Open, enEvent_Close, enState_Close},  {enState_Close, enEvent_Open, enState_Open}, };

     FSM fsm(enState_Open); fsm.ClearTrans(); for(int i=0; i<sizeof(trans)/sizeof(trans[0]); ++i) {  fsm.AddTrans(trans[i]); }

     fsm.HandleEvent(enEvent_Open); fsm.HandleEvent(enEvent_Close); fsm.HandleEvent(enEvent_Open); fsm.HandleEvent(enEvent_Open); fsm.HandleEvent(enEvent_Close);

     bool bClose = fsm.IsFinal(); return 0;}

     

    最新回复(0)