printf umleiten / Prameterübergabe
-
ists jetzt auch klar warum printf nicht geht?
-
nein
-
Original erstellt von Shade Of Mine:
ists jetzt auch klar warum printf nicht geht?Ganz klar, mir is ja auch zu Anfang aufgefallen, dass er bei einem int ja die Adresse ausgibt, logo, weil Pointer immer int(32bit) sind.
Somit hätte mir gleich klar sein können, das printf, was ja mehrere Argumente erwartet, nicht mit nem Pointer auf ne Liste klar kommen kann, aber in meine Kopf drin, passt alles kurzfristig mal :-).
Aber wie gesagt die v-versionen kannte ich net, weil ich die noch nie gebraucht hab bis dato, und so einfach hätte ich die wohl auch nicht gefunden. Oder wäre nicht auf die Idee gekommen, dass es sie überhaupt gibt.
Ich hatte eher schon damit rumgespielt dir Argumenten liste zu zerpflücken...Grüße Flow
-
arglist ist ein char*, printf erwatert einen int* ...ja?
aber arglist[0] [1] [2] und [3] zusammen müsstens ja auch irgendwie tun ...
wie kann ich die verknüpfen?
-
printf erwartet einen int (keinen int*)
-
Original erstellt von Dill:
aber arglist[0] [1] [2] und [3] zusammen müsstens ja auch irgendwie tun ...
wie kann ich die verknüpfen?arglist ansich ist ein char*
dieser muss zerlegt werden - und um ihn zu zerlegen muss man wissen nach was man sucht.deshalb muss man bei printf auch immer den richtigen bezeichner angeben!!
printf kann aber nicht checken ob die variable zum bezeichner passt - denn die variable wird ja erst mit hilfe des bezeichners erstellt!
bei
printf("%d",arglist);
übergibst du also arglist an printf
printf glaubt arglist ist ein int und behandelt ihn wie ein int
was natürlich falsch ist, da arglist ja ein va_list ist!
arglist wird falsch zerlegt und printf gibt blödsinn aus!vprintf dagegen verlang als zweiten parameter ein va_list!
deshalb wird printf meistens exakt so implementiert wie hier im thread myprintfvprintf bekommt also arglist und weiß, dass es sich dabei um ein va_list handelt - folglich zerlegt es arglist in einen int (denn der formatstring sagt, dass in arglist nur ein int steht -> "%d")
der unterschied zu printf sollte jetzt klar sein:
printf behandelt arglist wie einen int
vprintf zerlegt arglist in einen int
-
Original erstellt von Shade Of Mine:
arglist ansich ist ein»object type suitable for holding information needed by the macros va_start, va_arg, va_end, and
va_copy«char*
Eben, eben.
-
A little inaccuracy sometimes saves tons of explanation.
-
danke das hab ich nun kapiert ...
hätte aber noch gern gewusst wie ich mir aus den bytes auf die arglist zeigt nen int zusammenbasteln kann ...?
-
va_arg macht das. Den Typ erkennst Du am Formatstring.