-         

Ergebnis 1 bis 2 von 2

Thema: Steuern per Kommandozeile

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    13.01.2004
    Ort
    Bad Schwartau
    Alter
    38
    Beiträge
    51

    Steuern per Kommandozeile

    Anzeige

    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

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    15.11.2004
    Ort
    Aachen
    Alter
    32
    Beiträge
    246
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •