状态机:使用转换矩阵代替嵌套切换案例C ++

时间:2012-07-03 07:19:07

标签: c++ state-machine

我的状态机遇到了问题。我使用一个函数,它根据输入参数oldState和两个输入参数返回新状态。

在这个函数中我有很多嵌套的开关案例。我宁愿使用2x2转换矩阵,但不知道如何使用它。我确实使用状态和输入从状态图中创建了一个转换表。

但是我如何使用2暗淡的exaclty。数组transition_table[3][4]

3 个答案:

答案 0 :(得分:5)

你说你现在有这样的事情:

StateType transition (StateType old, InputType one, InputType two) {
    //... nested switch statements
    return new_state;
}

所以,你需要的是一个三维数组:

#define MAX_STATES 12
#define MAX_INPUT_VAL 2
StateType transitionTable[MAX_STATES][MAX_INPUT_VAL][MAX_INPUT_VAL] = {
    { { StateA, StateB },
      { StateC, StateD } },
    { { StateE, StateF },
      { StateG, StateH } },
    { { StateI, StateJ },
      { StateK, StateL } },
    //...
};

然后你会像这样过渡:

new_state = transitionTable[StateIndex(old)][one][two];

因此,假设StateIndex(StateC)返回2,那么:

old = StateC;
new_state = transitionTable[StateIndex(old)][1][0];
assert(new_state == StateK);

会导致new_state持有StateK

答案 1 :(得分:1)

给出这样的矩阵:

state1_input1 state1_input2 state1_input3
state2_input1 state2_input2 state2_input3
state3_input1 state3_input2 state3_input3

当你处于状态n并接收输入m时,你会看到行n,列m以找出新状态。假设您有3种可能的状态和4种可能的输入,您需要做的就是:

state = transition_table[state][input]

答案 2 :(得分:0)

根据您的描述,您不需要二维数组,1维很好。它应该这样:

void foo()
{
int States[2] = {1,2};
int currentState = 1;///initial state, let's say
int oldState;///prev. state
while(true)
{
  if(currentState == 1 && *add any other condition that you need*)
  {
      <...>do something<...>
      oldState = currentState;//saving the old state, in case you need it.
      currentState = states[currentState]; //changing the state
  }
  else if( currentState == 2 && *add any other condition that you need*)
  {
      <...>some other code<...>
  }
}

所以你有一系列的状态。然后根据输入参数计算该数组的索引(你说你使用旧状态和其他东西)。之后,您只需通过该索引从数组中获取新状态。 我的解释有点混乱,所以如果你需要澄清某些部分,请留言。