ステートマシンに問題があります。入力パラメーターoldStateと2つの入力パラメーターに基づいて新しい状態を返す関数を使用します。
この関数には、ネストされたスイッチケースがたくさんあります。2x2の遷移行列を使用したいのですが、使用方法がわかりません。状態図と入力を使用して、状態図から遷移表を作成しました。
しかし、私は2つの薄暗いものをどれほど正確に使用しますか。配列transition_table[3][4]
?
ステートマシンに問題があります。入力パラメーターoldStateと2つの入力パラメーターに基づいて新しい状態を返す関数を使用します。
この関数には、ネストされたスイッチケースがたくさんあります。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]
説明に基づいて、2次元配列は必要ありません。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<...>
}
}
つまり、状態の配列があります。次に、入力パラメーターに基づいてその配列のインデックスを計算します(古い状態と他の何かを使用すると言いました)。その後、そのインデックスによって配列から新しい状態を取得するだけです。私の説明は少し面倒なので、一部の説明が必要な場合はコメントを残してください。