Die Implementierung einer State Machine in C++, WIE?
Ich bin neu in C++.
Wie kann ich die implementieren eine State Machine in C++ ?
Ich bin immer nur die Nachrichten und wissen sollten in den nächsten Zustand.
Was ist die richtige Struktur, die ich verwenden müssen ?
Dank, Igal
- Was haben Sie bisher?
Du musst angemeldet sein, um einen Kommentar abzugeben.
EDIT:
Aufbau der Status-Diagramm ist wie folgt (Beispiel für ein cola-Automat):
Standard-Aktionen umgesetzt werden können, mit einer zweiten Karte, wo der Schlüssel ist nur der Staat, wie dieses:
Statt Druck "falsch-Meldung", die Logik ausführen, eine Suche in der StateDiagramForDefaults.
Wenn Aktionen Hinzugefügt werden muss, um das Zustandsdiagramm, der Wert der Karte sollte ein paar, bestehend aus einer Aktion und einem neuen Staat, wie diese:
Logik baut das Diagramm sollte dann "new" eine Instanz einer Klasse, die IAction implementiert, und diese in der StateDiagram.
Den ausführenden Logik dann nur führt die IAction Umsetzung über eine virtuelle Methode (z.B. execute() oder der ()-operator).
std::make_pair(currentState,m)
in deinem ersten code-block.Für den einfachen Zustandsautomaten können Sie nur verwenden Sie eine switch-Anweisung innerhalb einer Schleife, z.B.
Standard state machine Implementierung Techniken sind:
bisherigen Beiträge zeigen Beispiele von diesem
Technik)
Wenn Sie neue, state-machines und die Implementierung in C oder C++, würde ich empfehlen, mein Dr. Dobbs Artikel "Back to Basics", erhältlich bei http://www.ddj.com/184401737 (Sie müssen klicken Sie auf den link Drucken klicken Sie oben, um bequem den text Lesen.)
Keiner von standard-Techniken eignet sich für die hierarchische Zustandsautomaten (z.B. UML, statecharts). Wenn Sie interessiert sind, in der modernen UML-state-machines, würde ich empfehlen, meine 3-Teil Embedded.com Artikel "Ein crash-Kurs in UML-state-machines" (http://www.embedded.com/design/testissue/215801043).
Es sei denn, Sie implementieren eine state machine für den Zweck der Implementierung eines, würde ich empfehlen, dass Sie eine state-machine generator statt. Ragel ist eine sehr gute und robuste Lösung.
http://www.complang.org/ragel/
Eine Möglichkeit ist die Verwendung einer Klasse wie dieser (grobe Beispiel-code weiter):
Auf der Komplikationen ist, ob die Mitgliedstaaten sollten statische Schwungmasse passgenau, oder ob Sie tragen Instanz-Daten und sollten daher newed und gelöscht.
State* getNewState(const State& oldState)
- Methode, so dass Nachrichten wissen über Staaten anstelle von Staaten zu wissen, über Nachrichten. Eine Dritte Möglichkeit ist ein 2-dimensionales array mit einem getrennten element für jede mögliche Nachricht/Land-Kombinationen, in denen jedes element ist ein Funktionszeiger, der ist aufgerufen, zu behandeln, eine bestimmte Nachricht/Land-Kombination.Gosh, es ist nicht so kompliziert, wie es scheint. State machine code ist sehr einfach und kurz.
Codierung einer state-machine ist einfach zu trivial. Der schwierige Teil ist die Gestaltung einer state-Maschine, die verhält sich korrekt in allen möglichen Fällen.
Aber lassen Sie uns annehmen, dass Sie das richtige design. Wie kann man code?
Speichern den Zustand in einem Attribut, myState vielleicht.
Wann immer Sie eine Nachricht erhalten, schalten Sie die myState-Attribut, um den code auszuführen, das für diesen Staat.
3 In jedem Staat, wechseln Sie auf die Meldung, um den code auszuführen, das für diesen Staat UND diese Nachricht
So müssen Sie eine verschachtelte switch-Anweisung
Sobald Sie diese und läuft, es macht Spaß und ist einfach zu fügen Sie mehr Mitgliedstaaten und Nachrichten.
Sehen Implementierung Endlicher Automaten in ein Programm für verschiedene Arten von Gebäude-finite-state-machines.
Kasse die hierarchische state machine Artikel. Modellierung von Staaten wie die Klassen beschrieben, mit einem Beispiel.
Den ich verwende, ist auf dieser Basis ein: Maschinen-Objekte.
Scheint es gut optimiert und ist eine Hölle von viel weniger Komplex zu bedienen als Boost-Statechart.
Natürlich boost hat etwas für Sie auf Lager: Boost-Statechart-Bibliothek. Sie können auch ein paar nette tutorials gibt.
Können Sie die Ragel state machine compiler: http://www.complang.org/ragel/
Ragel code sieht wie folgt aus:
.. und es kompiliert: