Viele Strings abfragen und reagieren.
-
Hi Volk!
Ich habe gerade ein kleines Problemchen mit dem grundsätzlichen Aufbau eines C-Programms und wollte hier gerne Brainstorming durchführen. Weil das Ganze z.Z. mit einer ewigen if-else Abfragerei gelöst wurde, was ich nun ausbaden muss
Auf einer Schnittstelle empfange ich Strings die bestimmte Funktionen aufrufen.
Nun zur Sache, diese Strings haben folgende Kriterien:
- sind unterschiedlich lang
- können unterschiedliche Hardwaemodule ansprechen
- Manche Befehle haben kurze und lange Schreibweise
- es gibt allgemeine Befehle, mit denen man z.B. bei allen Modulen einen Reset auslösen kann etc.
- es sind ca. 200 Befehle
- mache Befehle heißen gleich und setzen oder fragen den Status nur durch ein zusätzliches Steuerzeichen ab.Also eine total chaotische Sache. Ich habe zwar schon mal sowas ähnliches gehabt, aber dabei musste ich nur auf CMD's achten. So habe ich einen Array aus Zeigern auf die Funktionen angelegt und schon hatte ich eine übersichtliche Programmierung. Aber wie ich an die gegebene Sache rangehen soll, habe ich leider bis jetzt keine brilliante Idee gehabt. Vielleicht hatte schon jemand damit zu kämpfen gehabt. Ich würde mich auf die Vorschläge freuen.
Die Strings sehen ca so aus (Werden als ASCII übertragen):
mod1,BAUDrate 19200
MODULE1,baud 19200
mod1,baud?
mod3,status ready
mod3,STAT ready?also, ziemlich wiederlich aufgebaut
-
also du könntest ein array basteln das den befehl und einen function pointer beinhaltet.
dann gehst du in einer schleife alle elemente des arrays durch, bis du den passenden befehl hast und rufst die hinterlegte function auf.
-
performancetechnisch vorteilhafter ist die binäre suche in diesem fall. siehe bsearch(3). da du die befehle alle im vorhinein kennst, kannst du das array vorsortieren.
-
Hast du Einfluß auf die Erzeugung der Strings und auf die Vergabe der Funktionsnamen der Funktionen, die aufgerufen werden ?
Der schnellste Zugriff in deinem Fall dürfte eine Hash-Lookup-Table sein.
-
mir ist keine hash-tabelle in c bekannt.. meien mimik immitiert diese.
Jaa, natürlich kann man auch noch ne Binärsuche machen, ist schneller
-
DocJunioR schrieb:
mir ist keine hash-tabelle in c bekannt.. meien mimik immitiert diese.
Wer imitiert was?
-
DocJunioR schrieb:
mir ist keine hash-tabelle in c bekannt..
Die soll doch erst noch programmiert werden.
-
war doch auch implizit mein vorschlag..
versuch nur immer, gleich die technik etwas zu erklären.. darüber vergess ich ganz gern die fachbegriffe ^^
-
DocJunioR schrieb:
war doch auch implizit mein vorschlag..
versuch nur immer, gleich die technik etwas zu erklären.. darüber vergess ich ganz gern die fachbegriffe ^^Da hast du dir die langsamste aller Techniken ausgesucht.
-
also ich denke, den suchalgorithmus zu optimieren war hier nicht die Problemstellung. Klar isses langsam. Aber jemanden noch mit ner binären Suche zu nerven, wenn das Prinzip noch nicht steht, halte ich für relativ sinnfrei..
-
... op möchte brainströming, da sind schleifen, binäre suche, hashverfahren und deren beurteilung genau das richtige thema.
-
DocJunioR schrieb:
Aber jemanden noch mit ner binären Suche zu nerven, wenn das Prinzip noch nicht steht, halte ich für relativ sinnfrei..
du meinst, ich nerve die leute mit binärer suche? *gg* tztztz, wie konnte ich nur?
hashtabelle ist auch gut, hat aber den nachteil, dass er das selbst programmieren muss.
-
naja. jeder tickt anders.. ich baue meist erstmal so, dass das eigentliche klappt.. dann optimiere ich die "nebensächlichkeiten"- wozu für mich binäre suche gehört..
wobei es ja in c eigentlich auch funktionen dafür gibt..
-
DocJunioR schrieb:
... wozu für mich binäre suche gehört..
wobei es ja in c eigentlich auch funktionen dafür gibt..c-funktionen für binäres suchen?
welche?
-
cbinary search ? schrieb:
DocJunioR schrieb:
... wozu für mich binäre suche gehört..
wobei es ja in c eigentlich auch funktionen dafür gibt..c-funktionen für binäres suchen?
welche?http://www.cplusplus.com/reference/clibrary/cstdlib/bsearch.html
-
wow, die kannte ich noch gar nicht.
aber die funktion scheint mir ziemlich eingeschränkt im gebrauch zu sein,
z.b. müssen alle elemente size_t size bytes gross sein.
die strings des op müssten folglich auch alle gleich lang sein.
-
cbinary search ? schrieb:
wow, die kannte ich noch gar nicht.
aber die funktion scheint mir ziemlich eingeschränkt im gebrauch zu sein,
z.b. müssen alle elemente size_t size bytes gross sein.
die strings des op müssten folglich auch alle gleich lang sein.Ne, die Strings nicht. Nur die Buffer, welche die Strings enthalten.
-
man sucht auf einem array von structs, die zum einen einen pointer für den string enthalten und zum zweiten einen funktionspointer.
-
besserwisser schrieb:
hashtabelle ist auch gut, hat aber den nachteil, dass er das selbst programmieren muss.
nö, vorteil, macht doch mehr spaß