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 einfach

    printf("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.


Log in to reply