我的状态机遇到了问题。我使用一个函数,它根据输入参数oldState和两个输入参数返回新状态。
在这个函数中我有很多嵌套的开关案例。我宁愿使用2x2转换矩阵,但不知道如何使用它。我确实使用状态和输入从状态图中创建了一个转换表。
但是我如何使用2暗淡的exaclty。数组transition_table[3][4]
?
答案 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<...>
}
}
所以你有一系列的状态。然后根据输入参数计算该数组的索引(你说你使用旧状态和其他东西)。之后,您只需通过该索引从数组中获取新状态。 我的解释有点混乱,所以如果你需要澄清某些部分,请留言。