Mailinglist Archive: opensuse-programming-de (24 mails)
| < Previous | Next > |
Re: richtig casten
- From: "Daniel Bauer" <mlist@xxxxxxxxxxx>
- Date: Wed, 19 Oct 2005 08:48:24 +0200
- Message-id: <019501c5d479$1af03b90$3202010a@mobile>
From: "Manfred Gahr" <M.A.N.E@xxxxxxxxxxx>
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
Am Montag, 17. Oktober 2005 11:47 schrieb Daniel Bauer:Hallo Manfred,
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 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
| < Previous | Next > |