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
