stdarg + float/double ??????????
-
Hallo zusammen!
Momentan spiele ich etwas mit den stdarg-Makros herum und stosse leider bei der Behandlung von Fliesskommazahlen auf einige Schwierigkeiten.
Folgende Funktion mit variabler Argumentenliste soll nichts weiter machen als alle Argumente der Reihe nach gemaess den in 'a_types' vorgegebenen primitiven Typen auf dem Bildschirm auszugeben:
( um das Ganze etwas einfacher zu halten werden lediglich 2 intrinsische Typen erkannt: int ('i') und float ('f') )#include <iostream.h> #include <stdarg.h> //-------------------------------------------------------- void foo(char* a_types, ...) { va_list args; va_start(args,a_types); while(*a_types) { switch(*a_types++) { case 'i': cout<<"integer: "<<va_arg(args,int)<<endl; break; case 'f': cout<<"float: "<<va_arg(args,float)<<endl; break; } } va_end(args); } //-------------------------------------------------------- int main() { foo("if", 1, 1.0); return(0); }Mit den Ganzzahlen gibt es keinerlei Schwierigkeiten ( short, int, long ... )
Jedoch bei den Fliesskommawerten scheint irgend etwas schiefzugehen.
Ausgabe im obigen Beispiel:integer: 1 float: 0Ich bin mir ziemlich sicher, dass es mein eigener Fehler ist! (benutze die stdarg-Makros zum ersten mal!) Darum bitte etwas Nachsicht!

Ich komme einfach nicht drauf wo der Fehler liegt!

Waere wirklich toll, wenn Ihr mir weiterhelfen koenntet!
Vielen Dank im voraus!
Gruesse,
TS++
-
Ich weiß nicht, wie va_arg castet, aber 1.0 ist kein float, sondern double. Probiers vielleicht mal mit 1.0f.
-
1.0 ist keine float-Konstante, sondern double - und die werden üblicherweise etwas anders dargestellt.
-
Hallo .filmor!
foo("if", 1, 1.0f);fuehrt leider immernoch zu der Ausgabe:
integer: 1 float: 0Gruesse,
TS++
-
Es gibt afaik ein paar Grundumwandlungen, die der Compiler für variable Argumente durchführt - dazu gehört char nach int und auch float nach double. Also hast du in jedem Fall dort double-Parameter in der Funktion.
(Anmerkung: Was kommt den raus, wenn du "va_arg(args,double)" verwendest?
-
Hallo CStoll!
Danke fuer die Antwort!
Bin auch grad auf folgende Zeilen gestossen:
If the type in question is one that gets promoted, the promoted type
should be used as the argument to va_arg(). The following describes
which types are promoted (and to what):
- short is promoted to int
- float is promoted to double
- char is promoted to intIch probiers gleich mal aus!
Gruesse,
TS++
-
Endlich, jetzt funktioniert's!!!

Das mit den Grundumwandlungen hab ich wirklich nicht gewusst!Danke fuer Eure Hilfe!
Gruesse,
TS++