Re: richtig casten
"Daniel Bauer" <[email protected]>
| Newsgroups | gmane.linux.suse.programming |
|---|---|
| Organization | dsb GmbH |
| Message-ID | <0d9001c5d334$f017aa10$3202010a@mobile> |
From: "Andre Rudlaff" <[email protected]> > Am Montag, 17. Oktober 2005 11:47 schrieb Daniel Bauer: >> From: "Ralf Corsepius" <[email protected]> >> >> > On Mon, 2005-10-17 at 10:04 +0200, Daniel Bauer wrote: >> >> From: "Ralf Corsepius" <[email protected]> >> >> >> >> > On Mon, 2005-10-17 at 08:43 +0200, Daniel Bauer wrote: >> >> >> leider weià ich nicht wie ich das hier am besten caste, hat >> >> >> jemand >> >> >> nen >> >> >> Tip, oder ne Quelle zum nachlesen? >> >> > >> >> > man 3 printf >> >> > >> >> >> void ausgabe (char *Var, void *Val) >> >> >> { fprintf (stdout, ">%s<\n>%s<\n", Var, Val); >> >> >> } >> >> > >> >> > Worin besteht dein Problem? >> >> > >> >> > Du willst einen "void*" nach stdout ausgeben? Einen void* als %s >> >> > auszugeben macht keinen Sinn. %s ist nur für char* definiert. >> >> > >> >> > Die entscheidende Frage wäre: Als was willst Du den "void*" >> >> > ausgeben? >> >> > >> >> > Ich nehme mal an, Du suchst %p. >> >> >> >> nein, es ist so richtig wie's dasteht, >> > >> > Dem ist nicht so. Dein Code ist fehlerhaft, falsch und, schlimmer >> > noch >> > ein Sicherheitsrisiko. >> > >> >> mein Problem ist, daà ich mir >> >> variablen Funktionen und Parametern arbeite. >> > >> > Keine Ahnung was Du unter variablen Funktionen und variablen >> > Parametern >> > verstehst, Funktionen mit variablen Argumentlisten werden >> > heutzutage >> > üblicherweise mittels <stdarg.h> verarbeitet. >> > >> > Sie mittels void* zu ersetzen zu wollen ist schlichtweg unsauber. >> > >> >> Ich habe einen "Würgaround" >> >> geschafft, indem ich das ganze wie unten gelöst habe, hatte aber >> >> die >> >> Hoffnung auf diesen Umweg durch richtiges casten verzichten zu >> >> können. >> >> >> >> void ausgabe (char *Var, void *Val) >> >> { char *Str; >> >> Str = Val; >> >> fprintf (stdout, ">%s<\n>%s<\n", Var, Str); >> >> } >> > >> > Ein übler Hack - Ich kann nur davon abraten, weil es keinen >> > Zusammenhang >> > zwischen \0-terminierten c-Strings (Nur solche kann printf >> > verarbeiten) >> > und void* gibt. >> > >> > Wenn deine "void*" \0-terminierte c-Strings sind, solltest Du sie >> > auch >> > als solche an diese Funktion übergeben. Und wenn schon casten >> > (Wovon >> > ich >> > mit Nachdruck abrate), dann besser unmittelbar im Funktionsaufruf. >> > >> > Noch weiterausgeholt, generell sollten sich derartige Casts immer >> > vermeiden lassen. Erscheinen sie als unvermeidbar, deutet das auf >> > ein >> > Problem in deinem Code hin (Falsch gewählter Typ). >> >> Hallo Ralf, >> >> ich finde Deine Aussage "das alles falsch ist" - ohne den kompletten >> Projektbereich zu kennen - etwas heftig. >> >> 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. >> >> Danke >> Daniel > > Hallo > > Meine erste Frage währe ob du unbedingt in C codieren musst, ansonsten > würden > sich ja eine C++ Templatefunktion anbieten: > > template<class T> void ausgabe(char* str, T i) { > std::cout << str << i << std::endl; > } > > Hier musst du dann lediglich darauf achten, das du nur Typen > übergibst, die > man auch mit dem << Operator ausgeben kann. Also wenn du auf diese > weise > selbsterstellte Klassen ausgeben willst musst du den Operator > überladen, > ansonsten gibt es nen Compilerfehler. > Wäre meiner Meinung nach so die sauberste Lösung. Hallo Andre, nachdem ich das programieren noch vor C++ gelernt habe, konnte ich mich leider nie damit anfreunden - ich verstehe es einfach nicht - daher wollte ich natürlich auf C bleiben. Trotzdem nochmals vielen Dank 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]