PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Steuern per Kommandozeile



SeaLion
28.02.2008, 16:10
Moin,

ich suche nach einer möglichst eleganten Lösung um meinem Controller per Tastatur Befehle geben zu können (Hierfür verwende ich eine serielle Schnittstelle und ein einfaches Terminalprogramm)

Jetzt möchste ich die Auswertung auf dem Controller verbessern. Bisher wartet der Controller immer, bis er ein Semikolon ";" als Endzeichen empfängt und fängt dann an die vorher empfangenen Zeichen per Stringcompare mit einer festgelegten Befehlsliste zu vergleichen. Jedem Befehl ist eine Funktion zugeordnet, die darauf hin ausgeführt wird.
Außerdem läßt sich an den Befehl noch ein Parameter fast beliebiger Länge anschließen, der mit an die Funktion übergeben wird.

Ich möchte jetzt vor allem die Suche nach dem richtigen Befehlund die Datenerkennung verbesser.
Die Suche ist einfach sehr langsam, da in der Tabelle jeder Befehl von obene nach unten durchsucht wird.
Außerdem brauchen die Daten immer ein bestimmtes Trennzeichen, damit sie vom Befehl unterschieden werden können udn es ist nicht sicher möglich mehrere getrennte Parameter zu erkennen.

Eigentlich ist das schon bald eine aufgabe für einen kompletten Parser / Compiler aber ich weiß nicht ob das auf einem Conrtoller nicht übertrieben ist und außerdem habe ich alles aus der Vorlesung schon wieder vergessen :-)

Mike

zerush
28.02.2008, 17:13
Also wenn du deine Befehlstabelle alphabetisch ordnest, dann fängst du einfach in der Mitte an zu suchen, und vergleichst das erste Zeichen der Eingabe mit dem ersten des Befehls:
a) ist es größer, so musst du weiter hinten suchen (wieder halbieren)
b) ist es kleiner, musst du weiter vorne suchen
c) bei Gleichheit musst du das nächste Zeichen vergleichen, bei Ungleichheit siehe a und b, bei Gleichheit c
=> Du erhälst logarithmische Laufzeit. O(log n)

Noch effektiver wäre wahrscheinlich eine Hashtabelle, nehmen wir mal als Beispiel die Quersumme deines Befehls (also der Ascii Werte der Zeichen) modulo einem bestimmten Wert. Dann schaust du in einem Array an entsprechender Stelle nach.
Du vergleichst dann noch ob der String auch wirklich überein stimmt. (Ansonsten falsche Eingabe).
=> Bei begrenzter Befehlslänge hast du quasi konstante Laufzeit! O(1)

Hierbei musst du jedoch noch schauen, wenn du zwei Befehle hast, bei der die Hashfunktion das gleiche Ergebnis liefert. Dann musst du evtl. zwei oder drei Vergleiche machen....

Ich hoffe das hilft dir weiter!

mfg
zerush