Hallo, es soll eine Library erstellt werden, die ASCII-Befehle dekodiert. Die Befehle beginnen mit einer Kennung gefolgt von beliebigen Daten. Die 'schnelle' Lösung ist kein Problem: ein Array im Flash mit Elementen einer Struktur, die die notwendigen Informationen enthalten. Ein Teil der Struktur ist die Kennung. Wird ein Befehl empfangen, ist das Array so lange zu durchsuchen, bis der passende Befehl gefunden worden ist. Der Haken an der Lösung: Das ganze kann bei vielen Befehlen (vergleichbare Projekte hatten schon mal >50 Befehle) ziemlich langsam werden, da im schlechtesten Fall die komplette Liste zu durchforsten ist. Nun zu meiner Idee: Wie wäre es, einen balancierten Binärbaum zu verwenden. Dadurch reduzieren sich die Suchschritte erheblich. Da der Inhalt des Baums schon zum Zeitpunkt der Übersetzung fest steht, brauche ich auf dem Zielsystem nur auslesen - die Balancierung entfällt. Mir ist zu Ohren gekommen, dass es Plugins für Eclipse für Codegeneratoren gibt, die sich für vielfältige Aufgaben konfigurieren lassen. Es wäre sehr geschmeidig, wenn mir ein solcher den balancierten Baum nach meinen Vorgaben im Quelltext erstellt. Hat jemand Erfahrungen mit Codegeneratoren? Wenn ja welche Systeme setzt Ihr ein? Kennt Ihr Links, die einem Anfänger auf diesem Gebiet weiterhelfen?
Andreas Müller schrieb: > Der Haken an der Lösung: Das ganze kann bei vielen Befehlen > (vergleichbare Projekte hatten schon mal >50 Befehle) Na ja, 50 ist noch nicht wirklich viel. Aber ich verstehe was du meinst. > Nun zu meiner Idee: Wie wäre es, einen balancierten Binärbaum zu > verwenden. Vom Prinzip her keine schlechte Idee. Aber du treibst zu viel Aufwand :-) > lassen. Es wäre sehr geschmeidig, wenn mir ein solcher den balancierten > Baum nach meinen Vorgaben im Quelltext erstellt. Du brauchst den Baum nicht explizit. Sortier dein Kommandos alphabetisch und benutz eine binäre Suche anstelle der lineare Suche. Das Ergebnis ist identisch zu einem balanziertem Baum, ohne dass du den Baum benötigst.
Karl heinz Buchegger schrieb: > Vom Prinzip her keine schlechte Idee. Aber du treibst zu viel Aufwand > :-) Vielleicht hast Du Recht aber trotzdem (böse Zungen behaupten, ich neige zur Sturheit :-) Ich habe während der Programmierung auf Controllern schon öfter den Wunsch verspürt, von Codegeneratoren Dinge erledigen zu lassen. Oft kommt genau das Szenario vor: Ich weiß schon bei der Erstellung des Programms genau, welche Daten/Algorithmen anfallen. Ich habe mir bisher mit Makros geholfen (mit all den Beschränkungen, die diese haben). Also zurück zu dem Beispiel und vergiss mal den Binärbaum und nimm die binäre Suche (wie vorgeschlagen): Ich möchte eine Library erstellen, die später in verschiedenen Applikationen verwendet wird. Sollte der Applikationsprogrammierer mal einen schlechten Tag haben (oder einfach die korrekte Reihenfolge groß/klein/numerisch nicht kennen) und die Befehle falsch einsortieren, geht's ans langwierige Suchen. Auch hier würde mir ein Codegenerator weiterhelfen. Meine Suche hat mich bisher zu http://www.openarchitectureware.org und XTEXT geführt. Das scheint ein ziemlicher Brummer zu sein ist aber sehr viel versprechend...
Andreas Müller schrieb: > Auch hier > würde mir ein Codegenerator weiterhelfen. Oder du gibst ihm eine Funktion, mit der er testen kann, ob seine Tabelle i.O. ist. Ist ja schnell gemacht. Für einfachere Commandlines, vor allem wenn alle Befehle die gleiche Grundstruktur haben, verwende ich dein Schema mit Kommandotabelle und Funktionspointer. Für kompliziertere Sachen benutz ich aber meist Compiler-Generatoren. Das geht einfach schneller und ist zuverlässiger. Gut, auf einem µC hatte ich das Problem so noch nie wirklich, da bin ich mit der Tabellen-Struktur eigentlich immer ausgekommen. Das Hauptproblem bei diesen Generatoren: Sie benutzen oft ziemlich ungeniert dynamische Stringallokierung, und das wird dann auf einem Mega8 fad :-)
Du könntest auch mit einer "HASH"-Tabelle arbeiten um die Abfragen zu beschleunigen. Du berechnest für jedes Kommando zum Beispiel eine einfache Checksumme (1-Byte) oder für grössere Befehlslisten z.B eine 16-Bit CRC. Der Komando-Interpreter (if oder case Struktur) wird dann viel schneller, wenn Du nur noch Byte oder Integer Vergleiche hast, anstelle von Stringcompaires...
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.