www.mikrocontroller.net

Forum: Compiler & IDEs uint64 und sprintf


Autor: micro1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
wie kann ich direkt ohne zu schiften eine 64 bit variable mit der
sprintf function in ein char schreiben? %d funktioniert ja nicht.

Muss man echt shiften oder geht es irgendwie direkt?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> wie kann ich direkt ohne zu schiften eine 64 bit variable mit der
> sprintf function in ein char schreiben?

Gar nicht. Ein char hat normalerweise 8 bit, so daß deine Variable da
niemals reinpassen kann. Da du sprintf erwähnst, nehme ich mal an, daß
du ein Array aus char meinst und dieses als Text haben willst. Dann
könntest du mal %lld versuchen.

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

Bewertung
0 lesenswert
nicht lesenswert
Nö, %lld ist im Moment nicht implementiert.  Sollte ich wohl
langsam mal tun, dann wächst die Vielfalt der printf-Optionen
nur noch weiter an:

. standard (kein float, kein int64_t)
. minimal (wie standard, aber keine Feldweiten und andere
  Extras)
. float (standard + float/double)
. int64 (standard + int64)
. everything (float + int64)

Der kanonische Weg, um an das richtige Format für einen uint64_t
zu kommen, wäre übrigens:
#include <inttypes.h>

...
  uint64_t u64var;
  ...
  sprintf(buf, "Die Zahl ist: " PRIu64, u64var);

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

Bewertung
0 lesenswert
nicht lesenswert
Hmm, Korrektur:
#include <inttypes.h>
...
  uint64_t u64var;
  ...
  sprintf(buf, "Die Zahl ist: %" PRIu64, u64var);

Autor: micro1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja natürlich meinte ich ein Array von char.
@Jörg Wunsch.
% ohne ein zeichen davor?
Was bedeutet PRIu64?

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

Bewertung
0 lesenswert
nicht lesenswert
> Was bedeutet PRIu64?

ISO-C99 Formatspezifikation für exact-width integer types.

RTFM:

http://www.nongnu.org/avr-libc/user-manual/group__...

(URL wird nicht anklickbar sein in Folge eines Forum-Bugs, musst
du cut&pasten.)

Autor: micro1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das geht nicht

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

Bewertung
0 lesenswert
nicht lesenswert
> Das geht nicht

Jetzt weiß ich alles.

Autor: micro1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups. War ein bischen wenig.
Nein wenn ich das von dir beschrieben sprintf nehme.

sprintf(buf, "Die Zahl ist: %" PRIu64, u64var);

bekomme ich immer fehler meldungen beim übersetzten.
Muss den vor dem % nichts hin ? Da muss doch immer ein Typangabe stehen
oder?

Autor: André Kronfeldt (freakazoid)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also im Link steht das Beispiel ohne '%':
#include <inttypes.h>
uint8_t smallval;
int32_t longval;
...
printf("The hexadecimal value of smallval is " PRIx8
       ", the decimal value of longval is " PRId32 ".\n",
       smallval, longval);

Wobei ich in der Definition von PRIx8 ...
#define   PRIx8   "x"
... irgendwie das '%' vermisse. Wird der String nicht nach:

'The hexadecimal value of smallval is x , the decimal value of longval
is ...' gewandelt? Komisch.

Grüße,
Freakazoid

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.

  Nein wenn ich das von dir beschrieben sprintf nehme.

  sprintf(buf, "Die Zahl ist: %" PRIu64, u64var);

  bekomme ich immer fehler meldungen beim übersetzten.

Wenn Du Fehlermeldungen beim Übersetzen bekommst (welche*?), dann liegt
es nicht am Formatstring, denn dessen Inhalt wird beim Übersetzen
nicht ausgewertet. Ob da kompletter Quark drinsteht, oder nicht, wirkt
sich erst zur Laufzeit des Programmes aus.


*) Wieso eigentlich wimmelt dieses Forum von Leuten, die bei
Fehlermeldungen des Compilers zwar feststellen, daß das welche sind,
aber nicht in der Lage sind, diese bei Fragen wiederzugeben?

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

Bewertung
0 lesenswert
nicht lesenswert
> Wieso eigentlich wimmelt dieses Forum von Leuten, die bei
> Fehlermeldungen des Compilers zwar feststellen, daß das welche sind,
> aber nicht in der Lage sind, diese bei Fragen wiederzugeben?

Frage ich mich auch öfters.  Manche Leute wollen offenbar partout
einen Controller (auf dem es sich ja nun wirklich saumäßig bescheiden
debuggen lässt) in C programmieren, obwohl sie keine Lust haben, C
einfach erstmal auf einem gut debugbaren Universalcomputer zu
erlernen.  Außerdem muss man offenbar anfangen, C zu hacken, ohne sich
die Mühe zu machen, die von papiergebunden (kann man ja auch in einer
guten Bibliothek ausfassen, wenn man's nicht kaufen will) bis
kostenlos im Internet verfügbaren vielen Einsteigerwerke auch nur
ansatzweise zu bemühen.

Zurück zum Problem:

Ich schrieb doch eigentlich klar und deutlich, dass es derzeit keine
Implementierung eines printf-Formats in der avr-libc gibt, die es
gestatten würde, einen uint64_t in eine Zeichenfolge umzusetzen.  Das
ist ein `nice to have' feature, ich werde das sicher bei Gelegenheit
mal angehen, aber wie sagen die Amis so schön: ``Don't hold your
breath.''

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wenn Du Fehlermeldungen beim Übersetzen bekommst (welche*?), dann
> liegt es nicht am Formatstring, denn dessen Inhalt wird beim
> Übersetzen nicht ausgewertet.

Gute Compiler werten den sehr wohl aus. gcc macht das (sofern die
verwendete libc printf das entsprechende Attribut mitgibt - ich weiß
nicht, ob die avr-libc das macht) und manch anderer wohl auch.
Allerdings gibt's dann beim falschen Formatstrings normalerweise nur
eine Warnung.

> *) Wieso eigentlich wimmelt dieses Forum von Leuten, die bei
> Fehlermeldungen des Compilers zwar feststellen, daß das welche
> sind, aber nicht in der Lage sind, diese bei Fragen wiederzugeben?

Das ist eine gute Frage. Aber das ist doch immerhin schon was. Oft wird
gern auch nur eine einzige Zeile Code, die mit dem Fehler nichts zu tun
hat, gepostet und der Hinweis, daß das nicht funktioniert, so daß man
nicht mal weiß, ob der Compiler eine Fehlermeldung gebracht hat oder
der Linker, oder ob das Programm nur nicht das Erwartete tut.

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.