Funktion mit variabler Parameteranzahl
-
Hallo,
ich wollte mal fragen ob jemand weiß wie man eine Funktion wie bei printf mit variable Parameteranzahl programmiert.
danke
-
Cool, ich kann mal helfen.
Ich würds aber net machen, weil es nicht typsicher ist. Mach dir lieber eine Variantklasse und übergib dann davon einen vector oder sowas.
Im Prototyp schreibst du an das Ende ..., also z.B. MeineFunktion(int normalerparameter, ...)
In der Funktion verwendest du dann die Funktion va_start(), va_arg() und va_end() (siehe MSDN) um auf die einzelnen zusätzlich übergebenen Argumente zuzugreifen. In der MSDN findest du bei den Funktionen auch ein schönes Beispiel für variable Argumentlisten.
Aber wie gesagt, nach Möglichkeit vermeiden und irgendwas anderes nehmen (<<-Operator überladen, Variantvector oder sowas).
ChrisM
-
Original erstellt von ChrisM:
Ich würds aber net machen, weil es nicht typsicher ist.Also ich hab da noch nie Probleme mit gehabt. Solange man bei Builtin-Typen bleibt dürfte eigentlich nix schief gehen
-
Hmm funktioniert schon ganz gut, aber gibt es noch eine andere Möglichkeit
zu merken das die Parameter zuende sind. Außer die 0 die bei va_arg() zurück-
gegeben wird und ohne Terminator wie im MSDN Beispiel?void durchschnitt( int first, ... ){ int z[32]; int i = 0; va_list arg_ptr; va_start( arg_ptr, first ); while( arg != 0 ){ z[i] = va_arg( arg_ptr, int ); i++; } va_end( arg_ptr ); }
-
Hast eine Variable zwei Bezeichnungen gegeben z und arg...
void durchschnitt( int first, ... ){ int z[32]; int i = 0; va_list arg_ptr; va_start( arg_ptr, first ); while( z[i] != 0 ){ z[i] = va_arg( arg_ptr, int ); i++; } va_end( arg_ptr ); }
[ Dieser Beitrag wurde am 23.04.2003 um 15:10 Uhr von SaM editiert. ]
-
@unknown:
Ich benutze in MSVC 6.0 Templates nach untenstehendem Muster zum Testen (so kann ich z.B. eine Funktion schnell mit mehreren Werten testen).
Dabei benutze ich "*argptr!=0" um zu prüfen, ob es noch weitere Argumante gibt, ich brauche also kein "Sentinel-Argument".
Das hat bis jetzt auch immer funktioniert. Da es aber nicht dokumentiert ist (jedenfalls nicht in meiner MSDN), setze ich es nicht in Produktivsystemen ein.
Vielleicht weiß ja jemand, ob das so zulässig ist oder nur "zufällig" funktioniert.template<class Base, class Instance, class argType> void VarArgs(Instance& Obj, void (Base::*fnc)(argType) ,...) { va_list argptr; va_start (argptr,fnc); argType tmp; do { tmp=va_arg(argptr, argType); (Obj.*fnc)(tmp); } while (*argptr!=0); };