3

我的状态机有困难。我使用了一个函数,它根据输入参数 oldState 和两个输入参数返回新状态。

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

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

4

3 回答 3

5

你说你目前有这样的事情:

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

因此,您似乎需要一个 3 维数组:

#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.

于 2012-07-03T07:46:13.810 回答
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]
于 2012-07-03T07:25:57.517 回答
0

根据您的描述,您不需要二维数组,一维就可以了。应该这样制作:

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<...>
  }
}

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

于 2012-07-03T07:23:57.550 回答