Forum: Compiler & IDEs Implementierung einer komplizierten Hierarchische State Machine


von Frank (Gast)


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?

von Oiver (Gast)


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

von Bernhard R. (barnyhh)


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

von Peter D. (peda)


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

von Frank (Gast)


Lesenswert?

Hallo Peter,

gibt's dafür ein Beispiel?

von Ano N. (oorim)


Angehängte Dateien:

Lesenswert?

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 ;)

von Peter D. (peda)


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

von StinkyWinky (Gast)


Lesenswert?

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.

von Ano N. (oorim)


Lesenswert?

Siehe mein Beispielcode :D

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.