Forum: Compiler & IDEs uint64 und sprintf


von micro1 (Gast)


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?

von Rolf Magnus (Gast)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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:
1
#include <inttypes.h>
2
3
...
4
  uint64_t u64var;
5
  ...
6
  sprintf(buf, "Die Zahl ist: " PRIu64, u64var);

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Hmm, Korrektur:
1
#include <inttypes.h>
2
...
3
  uint64_t u64var;
4
  ...
5
  sprintf(buf, "Die Zahl ist: %" PRIu64, u64var);

von micro1 (Gast)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Was bedeutet PRIu64?

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

RTFM:

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

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

von micro1 (Gast)


Lesenswert?

Das geht nicht

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Das geht nicht

Jetzt weiß ich alles.

von micro1 (Gast)


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?

von André K. (freakazoid)


Lesenswert?

Also im Link steht das Beispiel ohne '%':
1
#include <inttypes.h>
2
uint8_t smallval;
3
int32_t longval;
4
...
5
printf("The hexadecimal value of smallval is " PRIx8
6
       ", the decimal value of longval is " PRId32 ".\n",
7
       smallval, longval);

Wobei ich in der Definition von PRIx8 ...
1
#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

von Rufus Τ. F. (rufus) Benutzerseite


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?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.''

von Rolf Magnus (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.