www.mikrocontroller.net

Forum: Compiler & IDEs AVRGCC sprintf uint64_t problem


Autor: Bjoern (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe folgendes Problem mit einem ATMEGA128 und WinAVR (libc 1.4.3) 
und bin schon langsam am verzweifeln:

ich habe eine 64bit Integer-Zahl (also unsigned long long) die ich in 
dezimaler Form als String ausgeben möchte.

Mit

sprintf(string, "%llu", big_int);

kriege ich zwar ein ergebnis, aber die Zahl ist immer falsch (zb. statt 
0 gibt er 16853041 aus).

Wobei big_int als unsigned long long int definiert ist.
Ich habe es auch schon mit uint64_t und unsigned long long versucht, 
aber das ändert nichts.

Die obige Zeile funktioniert mit char, int und long problemlos (mit 
entsprechend angepassten '%u' '%lu'), aber ab long long leider nicht 
mehr.

Hat jemand eine Idee woran es liegen könnte oder noch besser, eine Idee 
wie ich zum gewünschten Ergebnis komme ohne sprintf zu verwenden?

Grüße, Björn

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Hat jemand eine Idee woran es liegen könnte

Ja: 64-bit-Datentypen werden von printf() einfach nicht unterstützt.
Die Unterstützung dafür könnte man reinbauen, aber das würde das
Teil heftig aufblähen.

Autor: Bjoern (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die Info, auch wenn ich lieber was anderes gehört hätte 
;-)

Hat evtl. jemand eine Idee für eine alternative?

Ich habe auch schon überlegt die Zahl in 2 'long' aufzuteilen, aber war 
bisher nicht in der lage sie so umzuformen dass ich als Anzeige von zwei 
aufeinanderfolgenden 32bit Zahlen in dezimal das selbe Ergebnis erhalte 
wie (theoretisch) mit einer 64bit Zahl in dezimal.

In google hab ich dazu auch nichts gefunden, wahrscheinlich falsch 
gesucht, denn irgendjemand muss das doch schonmal gemacht haben...


Grüße, Björn

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das übliche:

Fortgesetzte Division durch 10 mit Restbildung
und umdrehen des Strings.

http://www.mikrocontroller.net/articles/FAQ#Eigene...

Da du unsigned arbeitest, kannst du dir die Behandlung
des Vorzeichens sparen :-)

Autor: Bjoern (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ahhh....Na klar!

Danke für den Tipp!

Ich hab viel zu kompliziert gedacht!


Grüße, Björn

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.