warnung bei printf: int <-> size_t
-
Hallo
Ich kriege beim kompilieren mit g++ 4.1.2 (Red Hat) auf einer 64bit maschine
massenweise Fehlermeldungen der Art:
format ‘%d’ expects type ‘int’, but argument 3 has type ‘size_t’
Das betrifft meistens eine printf()-Anweisung.Was muss ich tun. um diese Warnungen loszuwerden?
Soviel ich weiss, ist size_t ein typedef fuer einen int,
darum ist das ganze etwas merkwuerdig.Diese Warnungen treten uebrigens nicht auf, wen ich den selben
code mit g++ 4.1.2 auf einer 32bit Mschine kompiliere.Danke
Jody
-
std::size_t ist ein typedef auf unsigned int, also kein normales int... aber das muss nicht immer so sein, je nach maschine kann sich auch ein anderer typ dahinter verbergen.
Lösung: da wir im C++ Forum sind,printf nicht verwenden, stattdessen cout etc.
-
Hallo,
size_t ist eher ein unsigned int. Die Warnung wirst du los indem du die Variable mittels static_cast in einen int castest oder indem du statt %d %u nimmst.
-
Für size_t gibt es die Formatangabe %z. Vielleicht erst ab C99, aber bei deiner Konfiguration sollte das passen.
-
Danke fuer die tips.
@Braunstein: das %u hat leider nichts geaendert.
@Bashar: mit %z meldet mein compiler auf der 64bit Maschine:
floattest.cpp:29: warning: unknown conversion type character 0xa in format floattest.cpp:29: warning: too many arguments for format
auf der 32bit maschine kompiliert es zwar, aber es funktioniert nicht richtig:
das code-stueck (v ist ein vector<int>)printf("mit %%z: %z\n", v.size());
liefert
mit %z: %
@otze: hast ja recht, aber ich finde es z.T. recht muehsam,
kompliziertere Formatierungen mit cout zu machen .
Beispiel: um mit printf eine Reihe von floats mit jeweils
2 Nachkommastellen anzuzeigen, mache ich einfachprintf("f1 : %.2f, f2: %.2f, f3:%.2f, f4: %.2f\n", f1, f2, f3, f4);
dabei spielt es keine Rolle wie gross die floats sind.
Aber wie muesste ich das mit cout machen?
Vielleicht habe ich den Stroustrup falsch verstanden,
aber die Genauigkeit fuer eine float-Darstellung muss
ich mittels cout.precision() angeben,
aber das betrifft dann die gesamte Anzahl von Stellen,
nicht die Nachkommastellen, d.h. um 12.34 zu erhalten,
muss ich die precision 4 nehmen, aber fuer 9876.54
muesste ich 6 nehmen.
M.a.W. ich muesste von jeder Zahl
zuerst die Anzahl Stellen vor dem Komma ermitteln, um so
einen geeigneten Wert fuer die precision zu kriegen.Oder gibt es evtl. praktischere Formatierungs-Methoden als
cout.precision?Jody
-
wenn du alles in fixpunkt schreibweise angeben willst (also nichts in der art 1e-10 ), dann kannst du vor dem precision noch ein fixed setzen, danach bezieht sich precision auf die Nachkommastellen.
http://www.cplusplus.com/reference/iostream/manipulators/fixed.html
-
Boost.Format könnte helfen.