va_list übergeben



  • Guten Tag Forum 🙂
    Mein Problem ist wie oben beschrieben, dass ich gern eine va_list übergeben möchte... wie komme ich dazu?
    Nun, ich habe eine fprintfartige Funktion geschrieben, die strings formatiert in eine Datei schreibt. Also ungefähr so:

    fprintfartig("Das ist ein Integer |i", 500);

    Jetzt habe ich aber noch eine andere Funktion geschrieben, die diese Funktion nutzt und noch einige Zusatzdaten anfügt. Ich rufe sie in dieser anderen Funktion ungefähr so auf:

    AndereFunktion ("Das ist ein Integer |i", 500);

    In dieser anderen Funktio sollen nun wie schon gesagt einige Zusatzinformationen hinzkommen. Also am Ende soll etwas wie

    Hier kommt eine Nachricht: Das ist ein Integer 500 Toll Nicht?

    in der Datei stehen.

    Dazu habe ich jetzt in der fprintfartigen Funktion einen weiteren "Identifizierer" hinzugfügt. (also etwas wie |i nur für nen formatierten String) und diese |S genannt.

    Beim "Identifizierer"



  • Ohje... versehentlich abgeschickt... jetzt gehts weiter:

    Identifizierer |S benutzt man ca. so

    fprintfartig("|S", dienachricht, meinevalist);

    Nun habe ich mir gedacht einfach nochmal fprintfartig wie folgt aufzurufen wenn er den Identifzierer |S findet:

    fprintfartig(va_arg(list, const char*), va_arg(list, va_list));

    Doch dieses funktioniert nicht ...



  • Ist die va_list wirklich "böse"?



  • Ja, in gewissem Sinne ist sie böse. Du verschenkst damit die Typinformation, sodaß altbekannte Fehler aus C, die in C++ eigentlich nicht überleben können, die Möglichkeit haben sich wieder einzuschleichen.

    Wenn Du Texte formatieren willst und was eher printf-artiges für C++ suchst, dann wirf mal einen Blick auf boost::format. Wenn Du eher den Umgang mit den variablen Parameterlisten lernen willst, dann ignorier das einfach. 😉



  • Falls ich dein Problem richtig verstanden habe:

    Vielleicht hilft es, die eigentliche Arbeit nicht von fprintfartig()
    machen zu lassen, sondern von einer anderen vfprintfartig().
    Die bekommt ebenfalls den ersten festen Parameter, und den
    Rest als va_list.
    Ansonsten macht sie das, was bisher fprintfartig() gemacht hat.

    fprintfartig() baust du so um, daß es aus seinen Parametern
    das va_list erzeugt und dann vfprintfartig() damit aufruft.

    Der Vorteil: AndereFunktion() kann direkt vfprintfartig() aufrufen,
    und den festen Parameter vorher nach Belieben verpfuschen
    bzw. durch etwas anderes ersetzen, und seine restlichen
    Parameter dann als va_list weiterreichen.

    So ähnlich wird es in der Std-Lib mit printf() und vprinf() etc. ja
    auch gemacht.

    Der umgekehrte Weg (aus einem va_list zur Laufzeit wieder
    eine Parameterliste zu konstruieren) ist nicht sinnvoll machbar.

    mfgkw



  • Danke für den Tipp 🙂


Anmelden zum Antworten