Re: richtig casten

Manfred Gahr <[email protected]>
Newsgroups gmane.linux.suse.programming
Message-ID <[email protected]>
Am Montag, 17. Oktober 2005 11:47 schrieb Daniel Bauer:
> Hallo Ralf,
>
> ich finde Deine Aussage "das alles falsch ist" - ohne den kompletten
> Projektbereich zu kennen - etwas heftig.
>
finde ich auch, aber etwas mehr info vorneweg wäre ganz hilfreich gewesen, 
aber da ist sie ja:

> Einfach gesagt: es geht darum das mein Programm sich eines Webservers
> bedient und dessen Ein- und Ausgaben steuert/empfängt. Zum Aufbau des
> HTML Codes benutze ich eine Funktionstabelle die mit div. Parametern
> gefüttert und zur Ausgabezeit angesprochen wird. Da in dieser Funktion
> alle Arten (char, int, long, double) verarbeitet werden, setze ich auf
> void Ptr.
>
> D.h. Tabelle wird gefüttert
> Tab [0].Variable = &String
> Tab [0].Funktion = &FunktionString
>
> Tab [1].Variable = &IntZahl
> Tab [1].Funktion = &FunktionInt
>
> Abarbeiten des HTML Bereichs in einer Schleife mit
> 1. Aufruf der Tab [0].Funktion (Tab [0].Variable)
> 2. Aufruf der Tab [1].Funktion (Tab [1].Variable)
>
> Die Funktionen verarbeiten dann ebf. wieder die gleichen Typen (char,
> int, long, double)
> FunktionString (char *String)
>  print string
>
> FunktionInt (int *IntZahl)
>  print int
>
> Ich kann also die Funktion nicht direkt anspringen. Daher meine Frage
> nach dem richtigen Cast.

Mit einem allmächtigen cast kann ich leider auch nicht dienen, du wirst wohl 
auch noch Informationen zum richtigen Typ in der Tabelle ablegen müssen 
( Tab[0].typ ), um dann in einem switch-Statement den richtigen cast zu 
benutzen. 
Nun das ganze in einer Funktion verstecken, die einen Tabelleneintrag 
übernimmt und die Funktion für Dich aufruft:

void funCall(tabEntry *entry) {
    switch(entry->typ){
    case /* konstante enum o.ä. für int */:
        (/*richtiger FP-Typ*/)(entry->Funktion)((int)(entry->Variable));
    case /* ... */:
    default:
        /* Fehlerbehandlung */
    }
}

oder so, wenn die Tabelle global verfügbar ist (due Struktur der Applikation 
lässt darauf schliessen...) kannst Du einfach nur den index übergeben...

Damit kannst Du schon recht flexibel arbeiten. Und da Du den Typ schon beim 
Anlegen der Tabelle kennst (anders gehts AFAIK kaum), ist das ganze auch 
weniger riskant was Pufferüberläufe angeht...
Nachteil:
wenn Du neue Typen (structs etc) einführst musst Du die Funktion funCall und 
die Stelle, an der die Tabelle gefüllt wird, ändern (aber auch nicht mehr)...

>
> Danke
> Daniel

HTH,
Manfred Gahr

P.S.:
Nur um einer endlosen Diskussion vorzubeugen: Natürlich kann man das in C++ 
mit Templates oder Vererbung schöner schreiben, aber hier war explizit C 
gefragt...

-- 
Um die Liste abzubestellen, schicken Sie eine Mail an:
    [email protected]
Um eine Liste aller verfügbaren Kommandos zu bekommen, schicken
Sie eine Mail an: [email protected]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.