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?
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
Hallo Peter, gibt's dafür ein Beispiel?
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 ;)
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.