Go Down

Topic: sprintf() mit uint_64 (Read 306 times) previous topic - next topic

BwieBertha

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})
:

Code: [Select]

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


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

Code: [Select]

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


Wie lauten die richtigen Argumente in sprintf()?

Danke im Voraus

Basti

combie

Alle sagen: Das geht nicht!
Einer wusste das nicht und probierte es aus.
Und: Es ging nicht.

BwieBertha

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


combie

Quote
Geht das also nicht mit Bordmitteln?
Nach anpassen der Linkeroptionen, evtl. möglich.
*ungetestet*
Alle sagen: Das geht nicht!
Einer wusste das nicht und probierte es aus.
Und: Es ging nicht.

BwieBertha

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

combie

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.
Alle sagen: Das geht nicht!
Einer wusste das nicht und probierte es aus.
Und: Es ging nicht.

ArduFE

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.

BwieBertha

#7
Aug 13, 2018, 01:06 pm Last Edit: Aug 13, 2018, 01:07 pm by BwieBertha
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:

Code: [Select]

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


anwofis

Hallo, eine Möglichkeit wäre folgendes:

Code: [Select]

uint64_t bla_2 = 1000000000000;
sprintf(my_buffer,"%lu",(uint32_t)(bla_2/1000000));


Dein Motorrad wird sicher keine 1 Mio. Km halten ;)

BwieBertha

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?

combie

Ja, Denkfehler.
Der Wert für die Ausgabe ist in km.
Bemerke: Die Division findet vorher statt.
Alle sagen: Das geht nicht!
Einer wusste das nicht und probierte es aus.
Und: Es ging nicht.

BwieBertha


postmaster-ino

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 ;)

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

Go Up