printf umleiten / Prameterübergabe



  • Hi

    Ich hab im Faq so ein schönes Thema dazu gefunden und da ich sowas geade benötige und noch nie gemacht habe, habe ich es einfach fast 1:1 kopiert kompiliert.

    Quellcode schaut so aus:

    #include <stdio.>
    #include <stdarg.h>
    
    int myprintf(char* text, ...)
    {
      va_list arglist;
      va_start(arglist, text);
      int n = printf(text, arglist);
      va_end(text);
      return n;
    }
    
    int main(int argc, char* argv[])
    {
    
        int all = 670;
    
        myprintf("variable: %d \n",all);
    
        return 0;
    }
    

    So, ich muss wohl irgendwas falsch gemacht haben, denn meine myprintffunktion gibt keinen Wert aus (Variable: 670), sondern einen hohen Wert (ich nehm an irgendeine Speicheradresse)->(Variable: 4433556(~) )

    Ich will eigentlich nur alles 1:1 umleiten. Kann mir irgendjemand sagen , was daran falsch ist und was ich anders machen muss??

    Vieln Dank
    Flow



  • .. statt printf



  • Original erstellt von <vprintf>:
    .. statt printf

    Entschuldigung, aber die Aussage dieses Satzes versteh ich nicht ganz 🙂

    wie statt printf .. ??

    Flow



  • Ähm upps

    so saudumm muss ich erstmal sein. Just in dem Moment indem ichs abgeschickt hatte, da war es mir als ob.. also klar wie Soßbrühe

    Ich kannte die v-versionen vorher nicht, hab sie jetzt mal in ner Referenz nachgeschaut und jetzt is mir alles klar!!!

    Vielen Dank

    Flow

    PS : bin müde nicht der hellste 🙂 ...



  • 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 myprintf

    vprintf 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.


Anmelden zum Antworten