Implementierung einer komplizierten Hierarchische State Machine

Gast #1704027
Lesenswert?

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 #1704054
Lesenswert?

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
#1704076
Lesenswert?

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
#1704153
Lesenswert?

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
#1705281
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren