sprintf() mit uint_64

Hallo Kollegen,
ich arbeite gerade an einem Motorradtacho (und das ist auch schon mein 6ter Tread diesbezüglich :/)...

Die Gesamtlaufleistung (Millimeter) möchte ich als "uint64_t GesamtMillimeter;" speichern; die Anzeige auf dem Display soll natürlich in KiloMeter erfolgen.

Demnach will ich die Millimeter per Sprintf() "umwandeln":

Folgender Code funktioniert, bringt mir aber Compilerwarnungen
(warning: format '%u' expects argument of type 'unsigned int', but argument 3 has type 'uint64_t {aka long long unsigned int}):

uint64_t GesamtMillimeter;
char GesamtKm[10];
.....
sprintf(GesamtKm, "%6ukm", GesamtMillimeter/1000000);

Dieser Code bringt keine Warnung, funktioniert aber nicht (GesamtKM ist immer 0):

uint64_t GesamtMillimeter;
char GesamtKm[10];
.....
sprintf(GesamtKm, "%6llukm", GesamtMillimeter/1000000);

Wie lauten die richtigen Argumente in sprintf()?

Danke im Voraus

Basti

Habe gerade hier einen Konverter für 64Bit vorgestellt.

Danke.. Geht das also nicht mit Bordmitteln? Es muss doch ein passendes Argument für sprintf geben...

Geht das also nicht mit Bordmitteln?

Nach anpassen der Linkeroptionen, evtl. möglich.
ungetestet

puh, davon lass ich lieber die Finger O_o.

Mal angenommen ich würde die Compilerwarnungen von oben ignorieren und es mit
sprintf(GesamtKm, "%6ukm", GesamtMillimeter/1000000);
probieren... (es funktioniert ja augenscheinlich)... ist das ne schlechte Idee?

mfg

Basti

Nunja...

Es warnt halt, dass es Zahlen abscheidet, welche nicht in den Bereich passen.
Ob das bei dir geschehen kann, und du damit leben kannst, weiß ich natürlich nicht.

Nur zur Ergänzung: Der richtige Formatspezifizierer für sprintf wäre %llu, aber da passiert bei den 8-Bittern gar nix, die Ausgabe ist leer. Bei den meisten 32 Bittern sollte es gehen.

Alles klar... dann müsst ihr mir aber nochmal kurz auf die Sprünge helfen...
Wie würde ich die bigToStr() Funktion in meinem Kontext (Laufleistung als mm gespeichert, Darstellung als char[10] via u8g2, ....) denn konkret anwenden?

Stehe etwas aufm Schlauch...

Derzeit schaut das ungefähr so aus:

uint64_t GesamtMillimeter;
char GesamtKm[10];
...
sprintf(GesamtKm, "%6ukm", GesamtMillimeter/1000000);       
...
u8g2.drawStr( 5, 10, GesamtKm);

(deleted)

Danke für die schnelle Antwort, aber die größte uint32 Zahl ist doch 4294967295, oder?
In mm entspräche das 4294km...

Hab ich einen Denkfehler?

Ja, Denkfehler.
Der Wert für die Ausgabe ist in km.
Bemerke: Die Division findet vorher statt.

Stimmt :slight_smile:

Hi

Das wären 18446744073 tausend Kilometer :o (ok, mit 32 Bit ist bei unter 4300km Schicht - Das wäre wohl schon etwas wenig)
Wenn ich mich nicht verrechnet habe - 6x zur Sonne und zurück - blöd, daß sich da oben die Reifen nicht an die gefahrene Strecke halten :wink:

MfG