Implementierung einer komplizierten Hierarchische State Machine

Gast #1704027
Hallo,
ich möchte eine ziemlich komplizierte Hierarchische State Machine in C 
implementieren.

Hier sehe ich folgende zwei Ansätze:

-mit switch-Anweisungen (siehe auch Artikelsammlung)

-oder mit Funktionszeigern (hier habe ich einige Ansätze gesehen, aber 
leider noch nicht ganz verstanden, z.B. hier www.state-machine.com/ bzw. 
http://www.accu-usa.org/Slides/samek0311.pdf oder kennt jemand hier ein 
besseres Bsp.)


Ist der Weg über Funktionszeiger bei komplizierten Projekten nun 
besser/übersichtlicher/SICHERER???

Welchen Weg würdet ihr warum wählen?
Gast
Frank schrieb:
> Ist der Weg über Funktionszeiger bei komplizierten Projekten nun
> besser/übersichtlicher/SICHERER???

Jain. Alles ist relativ ;-)

Schau die mal die Zustandsmaschine aus der Software zum Atmel butterfly 
an. Die findest du auch in einer Version für avr-gcc im Netz.

Oliver
Nimm das in diesen paar Folien referenzierte Buch ("Practical 
Statecharts in C / C++") und arbeite es durch. Sobald du es verstanden 
hast, siehst Du dann weiter.

Meine Meinung (ich habe das Buch vor Jahren gelesen):
Zu komplex! Das, was der C++-Compiler an Funktionspointerei aus gutem 
Grund vor dem Anwendungsentwickler verbirgt, genau das darf jetzt der 
Anwendungsentwickler "von Hand zu Fuß" implementieren.

Bernhard
Im Prinzip per Funktionspointer, aber praktisch per Index.
D.h. für 5 Ebenen brauchst Du nur 5 Indexe und hangelst Dich daran 
entlang.

Der Vorteil eines Index gegenüber einem Pointer ist, Du kannst einfach 
damit rechnen (nächter, vorheriger) und er kann nicht in den Wald 
laufen.
Kleiner als 0 geht nicht und der Überlauf kann vor dem Zugriff einfach 
abgeprüft werden (>=sizeof(array)).

Und wenn die Menüs nicht >256 sind, ist ein Index auch codesparender.


Peter
Hi

Ich hab vor längerem mal eine FSM gebaut (Finite State Machine). Das 
ganze funktioniert mit Fuktionspointer und Priorität. Schaus dir einfach 
mal an.

Grüße


Edit: An den Zuständen und Events nicht stören, das war eine Stoppuhr ;)
Angehängte Dateien:
Frank schrieb:
> gibt's dafür ein Beispiel?

Kann ich aber nicht veröffentlichen.

Im Prinzip hast Du eine einzige Menüfunktion.
Der wird ein Pointer auf einen Menüeintrag übergeben. Dieser zeigt auf 
den Formatstring, einen Zeiger auf die Tastaturliste und Zeiger auf 
Parameter.

Der Formatstring stellt den Menütext dar und optional einige Parameter.

Die Tastaturliste enthält die Tastenbelegung, d.h. was beim Drücken 
einer Taste passieren soll.
Z.B. in ein Menü hinein, zurück zum übergeordneten Menü, einen Menüpunkt 
hoch/runter, einen Parameter auswählen, ändern usw.

Da ja die meisten Menüpunkte die gleiche Tastenbelegung haben werden, 
eine extra Liste. Spart Platz gegenüber der Definition aller Tasten in 
allen Menüs.

Wieviel Zeiger auf Parameter man benötigt, muß man vorher festlegen, 
d.h. wieviel ein Menü maximal anzeigen kann.


Peter
Gast
Ich würde die Methode mittels Funktionspointern bevorzugen, weil man 
handlichere Einheiten bekommt, die mittels Unit-Tests besser zu prüfen 
sind als ein riesiges Switch-Case gewurstel.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.