У меня есть (несколько) большая таблица истинности/конечная машина, которую мне нужно реализовать в моем коде (встроенный 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 ) ]
Я дам этот выстрел и посмотрю, как это работает. Я также буду заменять 0 и 1 более полезными #defines, которые выражают то, что означает каждое состояние, вместе с/**/комментариями, которые объясняют входы для каждой строки выходов. Спасибо за помощь, всем!