代码中的真值表?如何构建状态机?

Han*_*nto 10 c state-machine truthtable

我有一个(有点)大的真值表/状态机,我需要在我的代码(嵌入式C)中实现.我预计这个状态机的行为规范将来会发生变化,所以我希望将来可以很容易地修改它.

我的真值表有4个输入和4个输出.我在Excel电子表格中拥有这一切,如果我可以通过一点格式将其粘贴到我的代码中,那将是理想的选择.

我以为我想像我这样访问我的真值表:

u8 newState[] = decisionTable[input1][input2][input3][input4];
Run Code Online (Sandbox Code Playgroud)

然后我可以访问输出值:

setOutputPin( LINE_0, newState[0] );
setOutputPin( LINE_1, newState[1] );
setOutputPin( LINE_2, newState[2] );
setOutputPin( LINE_3, newState[3] );
Run Code Online (Sandbox Code Playgroud)

但为了得到它,看起来我必须做一个相当混乱的表,如下所示:

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 }}}};
Run Code Online (Sandbox Code Playgroud)

那些嵌套的括号可能有些令人困惑 - 有没有人能更好地了解如何在我的代码中保留漂亮的表格?

谢谢!

根据HUAGHAGUAH的回答编辑:

使用每个人输入的合并(谢谢 - 我希望我能"接受"这些答案中的3个或4个),我想我会尝试将其作为二维数组.我将使用一个小的位移宏来索引我的数组:

#define SM_INPUTS( in0, in1, in2, in3 ) ((in0 << 0) | (in1 << 1) | (in2 << 2) | (in3 << 3))
Run Code Online (Sandbox Code Playgroud)

这将让我的真值表数组看起来像这样:

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 }};
Run Code Online (Sandbox Code Playgroud)

然后我可以像这样访问我的真值表:

decisionTable[ SM_INPUTS( line1, line2, line3, line4 ) ]
Run Code Online (Sandbox Code Playgroud)

我会试一试,看看它是如何运作的.我还将用更有用的#defines代替0和1来表示每个状态的含义,以及解释每行输出的输入的/**/注释.感谢大家的帮助!

HUA*_*UAH 3

不需要多维表。通过 4 位 => 4 位映射,您可以使用单个 u8[16] 数组将输入映射到输出。状态查找会便宜得多,并且您可以通过一些移位和掩码操作提取各个位。

如果填充行的算法很容易编写,您可以 #define 一个宏来按索引号填充每行。