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?
> 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.
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); |
Hmm, Korrektur:
1 | #include <inttypes.h> |
2 | ...
|
3 | uint64_t u64var; |
4 | ...
|
5 | sprintf(buf, "Die Zahl ist: %" PRIu64, u64var); |
Ja natürlich meinte ich ein Array von char. @Jörg Wunsch. % ohne ein zeichen davor? Was bedeutet PRIu64?
> 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.)
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?
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
. 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?
> 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.''
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.