Unspeziifierte Anzahl an Argumenten
-
Hi!
Ich rufe:
template <typename T> T getMax(T firstArg, ...) { va_list ap; va_start(ap, firstArg); T max = firstArg; while (true) { T* arg = va_arg(ap, T*); if (arg == 0) break; if (*arg > max) max = *arg; } va_end(ap); return max; }mit
double max = getMax<double>(a1, a2, a3);auf.
Kompiliert super, funktioniert aber leider nicht.
getMax gibt immer nur firstArg zurück. Die Schleife wird sofort per break verlassen.
Weiß jemand wieso?
Ich benutze den DevC++.MfG
-
man: va_arg liefert keinen Pointer auf das jeweilige Element, sondern das Element selber. Also sollte es richtiger heißen:
while (true) { T arg = va_arg(ap, T); if (arg == T()) break; if (arg > max) max = arg; }Und du mußt als Abbruchbedingung als letztes Element eine 0 in deinen Aufruf schreiben (in deiner variablen Argumentliste muß die Information stehen, wo die Argumente zu Ende sind, va_arg() würde dir sonst Pseudo-Argumente liefern, bis es an die Stack-Grenzen kracht).
-
warum machst du nicht ne std::list oder std::vector mit den Werten und übergibst sie?
Variable Argumentenlisten sind unter C++ sehr sehr unerwünscht.
-
oder wieso übergibst du nicht einfach 2 iteratoren?
template <typename Iterator> Iterator getMax(Iterator pos, Iterator end) { Iterator max=pos; while (pos!=end) { if (*pos > *max) max = *pos; ++pos; } return max; }musst du dann so aufrufen:
std::vector<double> vec; //füllen... vec.push_back(3.3); vec.push_back(5.37); vec.push_back(7); vec.push_back(18.356); vec.push_back(9.238); double max=*getMax(vec.begin(),vec.end());