Mailinglist Archive: opensuse-programming-de (24 mails)
| < Previous | Next > |
Re: richtig casten
- From: Andre Rudlaff <Weeds2000@xxxxxx>
- Date: Mon, 17 Oct 2005 16:03:47 +0200
- Message-id: <200510171603.47527.Weeds2000@xxxxxx>
Am Montag, 17. Oktober 2005 11:47 schrieb Daniel Bauer:
> From: "Ralf Corsepius" <rc040203@xxxxxxxxxx>
>
> > On Mon, 2005-10-17 at 10:04 +0200, Daniel Bauer wrote:
> >> From: "Ralf Corsepius" <rc040203@xxxxxxxxxx>
> >>
> >> > 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.
Gruß Andre
> From: "Ralf Corsepius" <rc040203@xxxxxxxxxx>
>
> > On Mon, 2005-10-17 at 10:04 +0200, Daniel Bauer wrote:
> >> From: "Ralf Corsepius" <rc040203@xxxxxxxxxx>
> >>
> >> > 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.
Gruß Andre
| < Previous | Next > |