У меня есть (несколько) большая таблица истинности / конечный автомат, которую мне нужно реализовать в моем коде (встроенный 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 }}}};
Эти вложенные скобки могут несколько сбивать с толку - кто-нибудь может лучше понять, как мне сохранить красивую таблицу в моем коде?
Спасибо!
Редактировать на основе ответа ХУАХАГУА:
Используя объединение всех данных (спасибо - я хотел бы «принять» 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, которые выражают, что означает каждое состояние, вместе с / ** / комментариями, которые объясняют входные данные для каждой строки выходных данных. Всем спасибо за помощь!