Die Antworten hier scheinen sehr komplex (aber genau, trotzdem.) Also hier sind meine Gedanken.
Zuerst mag ich Dmckees (operative) Definition eines FSM und wie sie für die Programmierung gelten.
ein endlicher Automat besteht aus einer endlichen Anzahl diskreter von Zuständen (I pedantic wissen, aber immer noch), kann die allgemein als ganzzahlige Werte dargestellt werden . In c oder C++ mit einer Enumeration ist sehr üblich.
Die Maschine reagiert auf eine endliche Anzahl der Eingänge, die oft mit einer anderen Ganzzahl Wertvariable dargestellt werden kann. In komplizierteren Fällen können Sie eine Struktur verwenden, um den Eingangszustand darzustellen.
- möglicherweise in einem anderen Zustand übergehen
- möglicherweise einige Ausgabe
erzeugen Sie einen So haben:
Jede Kombination aus internem Zustand und externen Eingang wird die Maschine verursachen Programm. Es hat Zustände, und es gibt eine endliche Anzahl von ihnen. ("Die Glühbirne ist hell" oder "Die Glühbirne ist dunkel" oder "Die Glühbirne ist aus." 3 Zustände. endlich.) Ihr Programm kann immer nur in einem Zustand sein.
Also sagen Sie, dass Ihr Programm die Zustände ändern soll. Normalerweise möchten Sie etwas passieren, um eine Statusänderung auszulösen. In diesem Beispiel nehmen wir Benutzereingaben, um den Zustand zu bestimmen - sagen wir, einen Tastendruck.
Vielleicht möchten Sie Logik wie folgt. Wenn der Benutzer eine Taste drückt:
- Wenn die Glühbirne "aus" ist, dann machen Sie die Glühbirne "dim".
- Wenn die Glühbirne "schwach" ist, die Glühbirne "hell" machen.
- Wenn die Glühbirne "hell" ist, schalten Sie die Glühbirne aus.
Offensichtlich statt „Austausch einer Glühlampe“, man könnte „die Textfarbe zu ändern“ oder was auch immer es ist, Sie Programm tun muss. Bevor Sie beginnen, sollten Sie Ihre Status definieren.
suchen also irgend pseudoish C-Code:
/* We have 3 states. We can use constants to represent those states */
#define BULB_OFF 0
#define BULB_DIM 1
#define BULB_BRIGHT 2
/* And now we set the default state */
int currentState = BULB_OFF;
/* now we want to wait for the user's input. While we're waiting, we are "idle" */
while(1) {
waitForUserKeystroke(); /* Waiting for something to happen... */
/* Okay, the user has pressed a key. Now for our state machine */
switch(currentState) {
case BULB_OFF:
currentState = BULB_DIM;
break;
case BULB_DIM:
currentState = BULB_BRIGHT;
doCoolBulbStuff();
break;
case BULB_BRIGHT:
currentState = BULB_OFF;
break;
}
}
Und voila. Ein einfaches Programm, das den Zustand ändert.
Dieser Code führt nur einen kleinen Teil der switch
Aussage - in Abhängigkeit von dem aktuellen Zustand. Dann aktualisiert es diesen Zustand. So arbeiten FSMs.
sind nun hier einige Dinge, die Sie tun können:
Offensichtlich ist dieses Programm ändert sich nur die currentState
Variable. Sie möchten, dass Ihr Code bei einer Statusänderung etwas Interessanteres macht. Die doCoolBulbStuff()
Funktion könnte, ich weiß nicht, tatsächlich ein Bild von einer Glühbirne auf einem Bildschirm. Oder so.
Dieser Code sucht nur nach einem Tastendruck. Aber Ihr FSM (und damit Ihre switch-Anweisung) kann den Zustand basierend auf dem auswählen, was der Benutzer eingegeben hat (z. B. "O" bedeutet "aus"), anstatt nur zu dem nächsten in der Sequenz zu gehen.)
Teil Ihrer Frage nach einer Datenstruktur gefragt.
Eine Person schlug vor, einen Status enum
zu verfolgen. Dies ist eine gute Alternative zu der #defines
, die ich in meinem Beispiel verwendet habe. Die Leute haben auch Arrays vorgeschlagen - und diese Arrays verfolgen die Übergänge zwischen Zuständen. Dies ist auch eine feine Struktur zu verwenden.
Angesichts der oben genannten, nun, Sie könnten jede Art von Struktur (etwas baumähnlich, ein Array, irgendetwas) verwenden, um die einzelnen Zustände zu verfolgen und zu definieren, was in jedem Staat zu tun ist (daher einige der Vorschläge zu Verwenden Sie "Funktionszeiger" - weisen Sie einem Funktionszeiger eine Statuszuordnung zu, die angibt, was in diesem Zustand zu tun ist.)
Hoffe, dass hilft!
Sie könnten Interesse an Ragel (http://www.complan.org/ragel/), einem State Machine Compiler, der C-Code generieren kann. Wenn es Ihren Zwecken nicht entspricht, ist vielleicht der generierte Code von Interesse. – sris
bezogen http://StackOverflow.com/Questions/1647631/C-State-Machine-Design/1651187 – jldupont