Mailinglist Archive: opensuse-programming-de (24 mails)
| < Previous | Next > |
Re: richtig casten
- From: Ralf Corsepius <rc040203@xxxxxxxxxx>
- Date: Mon, 17 Oct 2005 10:24:19 +0200
- Message-id: <1129537459.5390.100.camel@xxxxxxxxxxxxxxxxxxxxxxx>
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.
>
> Hallo Ralf,
>
> 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).
Ralf
> 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.
>
> Hallo Ralf,
>
> 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).
Ralf
| < Previous | Next > |