C++ Unerwartet unterschiedliche Ausgabe von std::cout und printf

foggy80

Lt. Commander
Registriert
Juli 2008
Beiträge
1.034
Hallo,
dieser Code:
Code:
std::cout << "\n" << tosave->nr << " " << tosave->dayofinsert << " " << tosave->dayofpurchase;
printf("\n%d %ld %ld", tosave->nr, tosave->dayofinsert, tosave->dayofpurchase);
ergibt bei mir folgende Ausgabe:
Code:
4 1305462836 1305462836
4 1305462836 0

nr ist vom typ int, dayofinsert und dayofpurchase sind vom typ time_t aus time.h.
tosave ist ein zeiger für eine struktur, die unter anderen diese drei variablen beherbergt.

Die erste Zeile gibt das aus was man erwarten würde, die zweite nicht.

Meine Frage ist: Wieso ist die Ausgabe der dritten Variablen in den jeweiligen Zeilen unterschiedlich? Wie man im Code erkennen kann, werden in jeder Zeile dieselben drei Variablen in derselben Formatierung ausgegeben.

Ich denke nicht, dass man mir jetzt genau sagen kann wo der Fehler liegt, dazu müsste ich wahrscheinlich etwas mehr Code meines Übungsprojekts offenlegen. Das wären dann aber über 300 Zeilen, die man dann auch erst verstehen muss...

Ich arbeite mit MS Visual C++ 2010

Ich wäre also sehr dankbar wenn jemand einen ungefähren Lösungsvorschlag hätte :)

Vielen Dank,
foggy
 
Zuletzt bearbeitet:
Das Problem kann man reduzieren auf:
Code:
	time_t x = 1305462836;
	printf("%d %d", x, x);

Komischerweise geht es, wenn man explizit in long castet:
Code:
	time_t x = 1305462836;
	printf("%d %d", (long)x, (long)x);

EDIT:
Hm so geht es:
Code:
time_t x = 1305462836;
printf("%lld %lld", x, x);
 
Zuletzt bearbeitet:
Das Problem ist printf,
printf arbeitet mit valargs, das heißt, du kannst alles als Parameter übergeben, ohne eine Fehler auszulösen.
Beispiel:
PHP:
string usereingabe;
cin>>usereingabe;
printf(usereingabe.c_str());//BÖÖÖÖÖSE
//Richtig: printf("%s",usereingabe.c_str());
//Oder: cout<<usereingabe;
Läuft gut, aber sobal ein Nutzer sowas wie %d oder %s eingibt -> es fehlt ein Parameter...
Du hast bei dem Beispiel einfach angenommen, dass es eine long ist, aber es war halt eine long long...
Pech für dich, vor allem, da es je nach Compiler/OS anders ist -> gar nicht gut.
Da machts C++ ein bisschen besser und wählt immer den richtigen Operator...

Wenn du den Typ von einem Objekt wissen willst, dann Rechtsklick -> Gehe zu Definition und das so lange, bis was blaues da steht...
 
sizeof(long long)=8
sizeof(long)=4
Bei Intel haben wir ein LSB, das heißt, die unwichtigen Zahlen stehen am Anfang.
Nun übergibst du eine doppelt so große Variable wie printf erwartet.
Wenn du noch einen Parameter ausgegeben hättest, dann wäre der Wert des daysofpurchase ausgegeben worden.
Code:
Stack, wie du ihn erzeugt hast
16-daysofpurchase oberer teil also der most significant -> 0
12-daysofpurchase
8--daysofinsert oberer teil also der most significant -> 0
4--daysofinsert
0--nr
Stack wie ihn printf erwartet hat
8--daysofurchase
4--daysofinsert
0--nr
 
Zurück
Oben