我的状态机有困难。我使用了一个函数,它根据输入参数 oldState 和两个输入参数返回新状态。
在这个函数中,我有很多嵌套的 switch case。我宁愿使用 2x2 转换矩阵,但不知道如何使用它。我确实从带有状态和输入的状态图中制作了一个转换表。
但是我如何使用 2 暗淡。数组transition_table[3][4]
?
我的状态机有困难。我使用了一个函数,它根据输入参数 oldState 和两个输入参数返回新状态。
在这个函数中,我有很多嵌套的 switch case。我宁愿使用 2x2 转换矩阵,但不知道如何使用它。我确实从带有状态和输入的状态图中制作了一个转换表。
但是我如何使用 2 暗淡。数组transition_table[3][4]
?
你说你目前有这样的事情:
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
.
给定这样的矩阵:
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]
根据您的描述,您不需要二维数组,一维就可以了。应该这样制作:
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<...>
}
}
所以你有一个状态数组。然后,您根据输入参数计算该数组的索引(您说您使用旧状态和其他东西)。之后,您只需通过该索引从数组中获取新状态。我的解释有点混乱,所以如果您需要澄清某些部分,请发表评论。