我有一个(有点)大的真值表/状态机,需要在我的代码(嵌入式 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 个),我想我会尝试将它作为一个二维数组。我将使用一个小的位移宏来索引我的数组:
#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 ) ]
我会试一试,看看效果如何。我还将用更有用的 #defines 替换 0 和 1,这些 #defines 表达了每个状态的含义,以及解释每行输出的输入的 /**/ 注释。谢谢大家的帮助!