Variable Parameterübergabe (float)

Mickeyman

Mitglied
Guten Tag,
ich bin seit kurzem dabei, mit Funktionen zu arbeiten, die eine variable Anzahl von Parametern erwarten. In den meisten Fällen funktionieren auch meine Funktionen, außer, ich übergebe/erwarte einen "float" Wert. Wenn dies der Fall ist, entstehen immer ganz merkwürdige Zahlen.

Dazu einmal der Quellcode:

Code:
#include <iostream>
#include <stdarg.h>


template<class typ>
typ __cdecl summe(typ Anzahl, ...) {
	va_list pArgumente;
	typ Ergebnis(0);

	va_start(pArgumente, Anzahl);
	
	for(;Anzahl > static_cast<typ>(0); --Anzahl) {
		Ergebnis += va_arg(pArgumente, typ);
	}
	va_end(pArgumente);
	return Ergebnis;
}

int main(void) {

	std::cout << summe(3.0f, 1.0f,4.0f,5.0f) << std::endl;
        std::cout << summe(3.0, 1.0,4.0,5.0) << std::endl;
        std::cout << summe(3, 1,4,5) << std::endl;

	system("PAUSE");
	return 0;
}

Bei den unteren beiden Ausgaben kommt jeweil 10 raus. Aber bei der Obersten 1.875. Im Internet habe ich einige Quellcodes gefunden, wo auch "float" Werte benutzt wurden, dort kam es aber scheinbar nie zu Problemen.

Ich hoffe mir kann da jemand helfen.


p.s.: Benutze VisualStudio2005Pro
 

langer1801

Erfahrenes Mitglied
Hallo,
wenn du mit dem Debugger in die Funktion summe hineingehst, wird beim ersten Aufruf Anzahl als 3.000000 gelesen - richtig -. Der erste und dritte Parameter werden als 0.000000 gelesen - Fehler-. Der zweite Parameter (4.0f) wird als 1.875000 gelesen - Fehler-.

Warum das so ist, kann ich nicht sagen, aber ich denke mal, dass es an der Verarbeitung des float-Types liegt. Vielleicht suchst du mal in dieser Richtung.
Oder jemand anderer weiß, warum die Zahlen falsch interpretiert werden.

Mfg

langer
 

Mickeyman

Mitglied
Danke für die Antwort, auch wenn ich der Lösung dadurch nicht näher gekommen bin. Hab auch schon reichlich danach im Internet gesucht aber leider nichts gefunden. Es verwundert mich allerdings, dass ich anscheinend der Einzigste bin, der so ein Problem hat.

Ich hoffe jemand hat da noch eine Idee.
 

Endurion

Erfahrenes Mitglied
Etwas versteckt in der MSDN steht bei mir, dass mit varargs eigentlich nur ints oder char* -Typen verarbeitet werden können. Bei printf und Konsorten klappt das dann nur richtig, weil man ja im Formatstring angibt, wie die Variable behandelt werden soll.
 

Mickeyman

Mitglied
Danke für die Antwort. Habe da doch noch was im Internet gefunden. Das Problem liegt nämlich daran, dass er Übergabeparameter vom Typ "float" automatisch in "double" umwandelt. Deswegen muss man folgendes machen:

Code:
float __cdecl summe(int Anzahl, ...) {
	va_list pArgumente;
	float Ergebnis(0.0f);

	va_start(pArgumente, Anzahl);
	
	for(;Anzahl > 0; --Anzahl) {
		Ergebnis += static_cast<float>(va_arg(pArgumente, double));
	}
	va_end(pArgumente);
	return Ergebnis;
}

Und schon hat es funktioniert. :)

Danke für eure Antworten.

p.s.: Die Seite, die mich zum Erfolg geführt hat, lautet: http://www.codeproject.com/cpp/argfunctions.asp