Ich habe eine (etwas) große Wahrheitstabelle/Zustandsmaschine, die ich in meinem Code (eingebettetes C) implementieren muss. Ich gehe davon aus, dass sich die Verhaltensspezifikation dieser Zustandsmaschine in Zukunft ändern wird, und deshalb möchte ich diese in der Zukunft leicht modifizierbar halten.Wahrheitstabellen im Code? Wie man Zustandsmaschine strukturiert?
Meine Wahrheitstabelle hat 4 Eingänge und 4 Ausgänge. Ich habe alles in einer Excel-Tabelle, und wenn ich das einfach mit ein wenig Formatierung in meinen Code einfügen könnte, wäre das ideal.
Ich dachte, ich mag meine Wahrheitstabelle für den Zugriff auf in etwa so:
u8 newState[] = decisionTable[input1][input2][input3][input4];
Und dann konnte ich den Ausgangswert Zugriff mit:
setOutputPin(LINE_0, newState[0]);
setOutputPin(LINE_1, newState[1]);
setOutputPin(LINE_2, newState[2]);
setOutputPin(LINE_3, newState[3]);
Aber damit es zu bekommen, sieht so aus als ob ich eine ziemlich verwirrende Tabelle machen müsste:
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 }}}};
Diese verschachtelten Klammern ca n etwas verwirrend sein - hat jemand eine bessere Idee dafür, wie ich einen hübsch aussehenden Tisch in meinem Code behalten kann?
Danke!
bearbeiten basierend auf HUAGHAGUAH Antwort:
eine Verschmelzung aller-Eingabe (danke - ich wünschte, ich könnte „akzeptieren“ 3 oder 4 dieser Antworten), ich denke, ich werde es versuchen als ein zweidimensionales Array. Ich werde Index in meinen Array ein kleines Bitverschiebung Makro weiter:
#define SM_INPUTS(in0, in1, in2, in3) ((in0 << 0) | (in1 << 1) | (in2 << 2) | (in3 << 3))
Und das wird meine Wahrheitstabelle Array wie folgt aussehen lassen:
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 }};
Und ich kann zugreifen dann meine Wahrheitstabelle wie also:
decisionTable[ SM_INPUTS(line1, line2, line3, line4) ]
Ich gebe das einen Schuss und sehe, wie es funktioniert. Ich werde auch die 0 und 1 durch hilfreichere # defines ersetzen, die ausdrücken, was jeder Zustand bedeutet, zusammen mit/**/Kommentaren, die die Eingaben für jede Zeile von Ausgaben erklären. Danke für die Hilfe, alle!
Da Sie eingebettet sind, sollte der Speicher eine Ressourcenbeschränkung sein? – EvilTeach
@EvilTeach: Danke für die Frage. Obwohl es eingebettet ist, laufen wir auf ziemlich schwerem Eisen mit viel Flash und RAM herum (im Rahmen des Zumutbaren). Codelesbarkeit ist hier der wichtigste Faktor. – HanClinto
Ein mehr. Haben Sie einen API-Anruf, mit dem Sie alle 4 Pins gleichzeitig setzen können? – EvilTeach