コードに実装する必要がある (やや) 大きな真理値表/ステート マシンがあります (埋め込み C)。このステート マシンの動作仕様は将来変更されることが予想されるため、今後も簡単に変更できるようにしておきたいと思います。
私の真理値表には 4 つの入力と 4 つの出力があります。すべてを Excel スプレッドシートにまとめてあります。それをコードに少しだけ書式を設定して貼り付けることができれば理想的です。
次のように真理値表にアクセスしたいと考えていました。
u8 newState[] = decisionTable[input1][input2][input3][input4];
そして、次の方法で出力値にアクセスできます。
setOutputPin( LINE_0, newState[0] );
setOutputPin( LINE_1, newState[1] );
setOutputPin( LINE_2, newState[2] );
setOutputPin( LINE_3, newState[3] );
しかし、それを得るには、次のようにかなり紛らわしい表を作成する必要があるようです。
static u8 decisionTable[][][][][] =
{{{{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 }},
{{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 }}},
{{{ 0, 0, 1, 1 },
{ 0, 1, 1, 1 }},
{{ 0, 1, 0, 1 },
{ 1, 1, 1, 1 }}}},
{{{{ 0, 1, 0, 1 },
{ 1, 1, 1, 1 }},
{{ 0, 1, 0, 1 },
{ 1, 1, 1, 1 }}},
{{{ 0, 1, 1, 1 },
{ 0, 1, 1, 1 }},
{{ 0, 1, 0, 1 },
{ 1, 1, 1, 1 }}}};
これらのネストされた括弧はやや混乱を招く可能性があります-コードで見栄えの良いテーブルを保持する方法について、より良いアイデアを持っている人はいますか?
ありがとう!
HUAGHAGUAHの回答に基づいて編集:
みんなの意見を組み合わせて (ありがとう -- これらの回答のうち 3 つまたは 4 つを "受け入れる" ことができればいいのにと思います)、2 次元配列として試してみようと思います。小さなビットシフト マクロを使用して、配列にインデックスを付けます。
#define SM_INPUTS( in0, in1, in2, in3 ) ((in0 << 0) | (in1 << 1) | (in2 << 2) | (in3 << 3))
これにより、真理値表の配列は次のようになります。
static u8 decisionTable[][] = {
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 },
{ 0, 0, 1, 1 },
{ 0, 1, 1, 1 },
{ 0, 1, 0, 1 },
{ 1, 1, 1, 1 },
{ 0, 1, 0, 1 },
{ 1, 1, 1, 1 },
{ 0, 1, 0, 1 },
{ 1, 1, 1, 1 },
{ 0, 1, 1, 1 },
{ 0, 1, 1, 1 },
{ 0, 1, 0, 1 },
{ 1, 1, 1, 1 }};
そして、次のように真理値表にアクセスできます。
decisionTable[ SM_INPUTS( line1, line2, line3, line4 ) ]
私はそれを試してみて、それがどのように機能するかを見ていきます. また、0 と 1 を、出力の各行の入力を説明する /**/ コメントと共に、各状態の意味を表すより役立つ #define に置き換えます。助けてくれてありがとう、みんな!