> jedoch sehe ich auch daraus das es keine alternative zu einer case
> oder if auswertung gibt. ?
Oh. Da gibt es noch jede Menge anderer Möglichkeiten.
Die von dir angesprochene Lookup-Tabelle ist zb eine.
Ich gehe allerdings davon aus, dass du nur wenige Kommandos
auf der Schnittstelle hast. Da ist eine switch-case Leiste
mehr als ausreichend und erfüllt seinen Job hervorragend.
Eine Lookup Tabelle könnte zb so aussehen:
Gesucht ist duch die Umsetzung eines Kommandos (in Form eines
Characters) in einen Funktionsaufruf.
Da gibt es jetzt mehrere Möglichkeiten, je nachdem über wieviele
zu erkennenden Kommandos wir reden. Sind es relativ viele, so dass
das Alphabet für das Kommandobyte gut ausgenutzt wird, so macht
man sich ganz einfach ein Array, wobei dann das Kommandobyte als
Index in dieses Array benutzt wird (Handlexxx sind jeweils Funktionen
die dafür zuständig sind ein Kommando abzuarbeiten).
typedef void (*Fnct)(void);
Fnct Functions[] =
{ HandleA,
HandleB,
HandleC,
HandleD,
NULL,
HandleE,
... etc
HandleZ
};
void HandleA()
{
// Bearbeite das Kommando 'A'
}
void HandleB()
{
// Bearbeite das Kommando 'B'
}
...
Damit ist die Bühne aufgesetzt, jetzt muss nur noch in main(),
abhängig vom Kommandobyte die richtige Funktion aufrufen:
...
if( Functions[ Command[0] - 'A' ] )
Functions[ Command[0] - 'A' ]();
(Command[0], also das erste Byte, wird als index in die Tabelle
von oben mit den Funktionspointern genommen und die Funktion ueber
den Funktionspointer aufgerufen.
Möglichkeit 2:
Wenn es nur wenige Kommandos sind, dann ist obiges Array etwas
überkandidelt. Die meisten Einträgre sind NULL. Dann ist es ev.
besser sich eine Struktur zu basteln
struct Entry {
char Command;
Fnct Function;
}
Damit kann ich dann gezielt ein Array bauen:
struct Entry Functions[] = {
{ 'M', HandleMove },
{ 'U', HandleUp },
{ 'D', HandleDown },
{ 'W', HandleWater }
}
Nette kleine Tabelle :-)
Jetzt geht man mit dem ersten Zeichen des Kommandos wieder her
und durchsucht die Tabelle nach dem entsprechenden Eintrag. Hat
man ihn gefunden, hat man dann auch den Funktionspointer und kann
ueber diesen die Funktion aufrufen. Bei derartig wenig Kommandos
kann man ganz einfach linear suchen:
for( i = 0; i < sizeof(Functions)/sizeof(*Functions); ++i )
if( Command[0] == Functions[i].Command )
Functions[i].Function();
Wenn es mehr Kommandos sind, könnte man auch eine binäre suchen
machen, oder das Ganze über eine Hashtable realisiern
Eine komplett andere Möglichkeit wäre es einen schönen Parser
aufzusetzen. Nimmt man dann wenn man nicht nur Kommandos mit
einem Buchstaben hat, sondern Schlüsselwörter.
Oder ...
Es gibt noch viele Möglichkeiten.
Aber für wenige Kommandos dürfte eine switch-case Leiste
das Einfachste aber nicht notwendigerweise das Schlechteste sein.