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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.