problemmit fehlermeldung



  • hallo leute

    ubuntu 17.1 und g++ 7.2.0

    bekomme folgende fehlermeldung:

    globals.xpe.cpp: In function ‘void {anonymous}::print_current_time(std::ostream&, std::chrono::hours)’:
    globals.xpe.cpp:64:43: warning: format ‘%llu’ expects argument of type ‘long long unsigned int’, but argument 8 has type ‘std::chrono::duration<long int>::rep {aka long int ’ [-Wformat=]
                  s.count(), tp/milliseconds(1));
                  ~~~~~~~~~                    ^
    globals.xpe.cpp:64:43: warning: format ‘%llu’ expects argument of type ‘long long unsigned int’, but argument 9 has type ‘std::__success_type<long int>::type {aka long int}’ [-Wformat=]
    

    zeile 64 sieht folgend aus:

    std::sprintf(buffer, "[%04u-%02u-%02u %02lu:%02lu:%02llu.%03llu]: ", std::get<0>(date),
    	            std::get<1>(date), std::get<2>(date), h.count(), m.count(),
    	            s.count(), tp/milliseconds(1)); // Zeile 64
    

    die printf anweisung hat 8 parameter. der g++ bezieht sich da aber auf argument 8 und 9. was will er mir damit sagen?
    fuer mich ist der g++ eh so schon etwas ungewohnt, weil ich normalerweise unter windows mit VS arbeite.

    compiliert hab ich einfach mit g++ -o test *.cpp

    kann mir jemand nen tip geben?

    Meep Meep



  • Also ohne die Datentypen Deiner ganzen Argumente zu kennen, kann ich Dir doch sagen, dass ich 9 Argumente in Deiner printf-Anweisung zähle:

    buffer
    "[%04u-%02u-%02u %02lu:%02lu:%02llu.%03llu]: "
    std::get<0>(date)
    std::get<1>(date)
    std::get<2>(date)
    h.count()
    m.count()
    s.count()
    tp/milliseconds(1)

    😕



  • ...und der g++ sagt dir auch, dass Argumente 8 und 9, also

    s.count() und
    tp/milliseconds(1)

    jeweils im Endeffekt "long int" sind (das was bei "aka" steht, bzw. was sich aus std::chrono::duration<long int>::rep ergibt), du aber "long long unsigned int" in deinem Formatstring erwartest.



  • ja, in der tat. ich hab scheinbar buffer nie als parameter mitgezaehlt 😕

    aber was ich trotzdem nicht verstehe ist, warum er sagt das es long int werte seien.
    s = std::chrono::noneseconds
    milliseconds = std::chrono::milliseconds
    und tp = now.time_since_epoch(); wobei now = system_clock::now();

    muessten das nicht alles 64 bit werte sein?

    MEep Meep



  • Meep Meep schrieb:

    aber was ich trotzdem nicht verstehe ist, warum er sagt das es long int werte seien.
    ...
    muessten das nicht alles 64 bit werte sein?

    Meep Meep schrieb:

    ubuntu 17.1 und g++ 7.2.0

    Unter 64-Bit Linux ist long auch 64 Bit.
    Allerdings ist long long auch 64-Bit breit



  • was muss ich dann bei printf reinschreiben, damit der fehler weg ist ?
    scheinbar liegt es dann daran das er einen long long bekommt aber llu ist unsigned long long ?



  • Meep Meep schrieb:

    aber was ich trotzdem nicht verstehe ist, warum er sagt das es long int werte seien.

    muessten das nicht alles 64 bit werte sein?

    Nein. http://www.cplusplus.com/reference/chrono/nanoseconds/ sagt, dass es mindestens 64 Bit sein müssen, bei millisekunden mindestens 45 Bit.

    Aber es kann gut sein, dass auf deinem System long long dasselbe ist wie long (zumindest bei mir ist das so, beides 64 Bit). Da steht aber noch ein weiteres Wort in der Fehlermeldung: unsigned. Die Rep-Types sind signed. Siehe ebenfalls obigen Link.

    Edit: sehe gerade, dass du da schon selbst drauf gekommen warst. Siehe http://www.cplusplus.com/reference/cstdio/printf/: long int ist %ld, long long int ist %lld.


Log in to reply