Re: richtig casten
"Daniel Bauer" <[email protected]>
| Newsgroups | gmane.linux.suse.programming |
|---|---|
| Organization | dsb GmbH |
| Message-ID | <019501c5d479$1af03b90$3202010a@mobile> |
From: "Manfred Gahr" <[email protected]> > Am Montag, 17. Oktober 2005 11:47 schrieb Daniel Bauer: >> 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)... Hallo Manfred, danke für die Info, ich werde mir das genauer ansehen, ob ich das als Lösung verwenden kann, od. ob ich bei meinem "Schmutztrick" bleibe. Danke Daniel -- 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]