va_list: function (char * format, ...);



  • hi!

    warum funktioniert das nicht?! wenn ich die funktion mit AddText("%s : %s","Test","Test") aufruf?! den format string gibt er mir richtig aus, davor aber wirre zeichen und danach auch, also " œí : " um genau zu sein 🙂

    void Print(char *format,...)
    {
        int textend;
        char * buf[4096];
        va_list argp;
    
        va_start(argp, format);
        sprintf(buf,format,argp);
    
    print(buf);
    }
    

    gruss,

    matthias



  • Das geht so nicht. Versuchs mal mit vsprintf aus stdlib.h



  • löl, und versuch's außerdem mal mit ein bisschen speicher für buf 🙂



  • danke...

    ich hab aber eigentlich kein konsoleprogramm, sondern ein gui, und ich würd gern die parameter als string in einem buffer haben, wie bekomm ich das hin?

    und mehr speicher für den buffer brauch ich ned, die funktion wird nur mit parametern aufgerufen die eh viel kleiner sind als die 4096 bytes, ja ich weiss ist nicht schön, aber im moment ist mir das noch egal, ich will erstmal das beliebig viele parameter funzen 🙂

    kann ich nicht die parameter alle in einen buffer reinschreiben?

    vprintf bringt mir in dem fall leider gar nichts...



  • huch, sorry, hab nicht gewusst/gesehen das vsprintf auch in einen buffer schreibt...

    danke, ich probiers mal!



  • wenn du 4096 bytes an Speicher reservieren willst, sollte das IMHO so aussehen

    char buf[4096]; und nicht so char * buf[4096];



  • du sollst vsprintf benutzen, dann klappts. schreibt die variablen parameter alle zusammen 😉 in den buffer



  • du solltest lieber vsnprintf benutzen (C99), da du damit Bufferoverflows verhindern kannst 🙂

    außerdem solltest du va_end nicht vergessen 🙂



  • geil, danke!!! 😃

    so funzts:

    void AddText(char *format,...)
    {
        int textende;
        char * buf[4096];
        va_list argp;
    
        va_start(argp, format);
        vsnprintf(buf,sizeof(buf),format,argp);
    
    print(buf);
        va_end(argp);
    }
    


  • char* buf[4096];

    denk mal nach was fuer ein Type buf ist...



  • wie meinst du das?

    ich muss dazusagen, das ich mit dem buf nicht ein print mach, sondern was anderes, das war nur zur vereinfachung...

    ich weiss ned ob das stimmt aber so seh ichs:

    buf ist ein pointer auf einen array von chars.

    (was es ist, ist mir fast egal, weil es funktioniert *g* :))

    gruss,

    maconey



  • jo, und irgendwann machts dann *buf*



  • und nun schau dir an, was vsnprintf als Argument erwartet



  • jo, und irgendwann machts dann *buf*

    gut ausgedrückt *g*

    (ja, ist sicher nicht wünschenswert)

    int vsnprintf(char *str, size_t size, const char *format,va_list ap);

    das einzigste wo ich probleme festellen konnte ist wenn format nicht den parametern enspricht was man dieser funktion übergeben hat...

    klärt mich mal auf, sorry ich weiss grad echt ned was ihr meint

    " snprintf and vsnprintf do not write more than
    size bytes (including the trailing '\0'), and return -1 if
    the output was truncated due to this limit."

    von der länge her passt das für buf also auch...

    sorry, keine ahnung 😕 😕

    aber es funzt trotzdem 😃



  • was du brauchst ist buf[4096]

    Lies dir das Kapitel ueber Zeiger und Arrays in deinem Buch nochmal durch, du scheinst es noch nicht ganz verstanden zu haben...



  • hi!

    irgendwie kann ich mich grad ned einloggen, naja egal,

    ich versteh nicht was ihr meint, sorry, zeiger hab ich denk ich schon kapiert...

    ich verwende den borland c - compiler, vielleicht entspricht der auch nicht 100%ig dem c- standard und ich hab deswegen keine probleme?

    könnt ihr mir vielleicht ein beispiel sagen wann es mal *buf* macht ?

    das die funktion einen char [] will ist mir klar, aber warum es mit char * [] nicht gehen soll / probleme gehen kann versteh ich nicht, c castet den char * doch auch zu char []? sonst würde es doch sicher probleme geben wenn es das nicht tun würde?!

    gebt mir mal einen grösseren tip, ich steh grad voll auf dem schlauch...

    danke für die hilfe,

    maconey



  • c castet den char * doch auch zu char []?

    Stimmt, das geht sogar in beide Richtungen.

    Aber: char*[] wird zu char**. Also ein Zeiger auf einen Zeiger.



  • ja also, wo liegt dann das problem...?!



  • char* und char*[]

    die sind ein klein wenig unterschiedlich!
    Findest du den Unterschied?

    nochmal:
    char* und char[] kann man beliebig austauschen (es sind nur kleine unterschiede zwischen den Beiden)

    Aber char* und char*[] ??
    Du kannst mir sicher sagen, welchen type buffer hat:
    char* buffer[512];
    oder?



  • char* buffer[512];

    das ist ein char [512] auf den ein pointer zeigt die länge ist im gegensatz zu
    char * festgelegt

    einer von uns beiden liegt wohl jetzt falsch 🙂

    und ich glaub ich bins, aber warum weiss ich leider nicht

    schönes wochenende und gruss 🙂

    matthias


Anmelden zum Antworten