Forum: Mikrocontroller und Digitale Elektronik AVR int64_t in char[] umwandeln


von Daniel W. (danie)


Lesenswert?

hallo leute,

vorabinfos:
cpu: avr - mega128
compiler: winavr(aktuell)

ich möchte eine int64_t zahl in einen string umwandeln damit ich ihn 
mitdem uart ausgeben kann.

ich habs auf diese art versucht:

int64_t zahl;
char  puffer[40];

zahl=...;

sprintf(puffer, "%d",(int64_t)zahl);

ich hab mir schon die doku zur libc durch gesehen und kapiert dass 
sprintf auf vfprintf() zurückzuführen ist.
aber kann vfprintf mit irgenteinem flag 64bitter konvertieren?

ich hoffe ich habs halbwegs rübergebracht was ich nicht hinbekomme.

danke schon mal im vorraus, danie

von Karl H. (kbuchegg)


Lesenswert?

> sprintf(puffer, "%d",(int64_t)zahl);

Das wird mit Sicherheit nichts. %d ist für normale
int, also int16_t. Du musst dir aus der Doku raussuchen
welches Formatierzeichen für long long (das dürfte
ein int64_t sein), zuständig ist.

von Daniel W. (danie)


Lesenswert?

ich hab gerade noch nach den itoa varianten gesucht, die können auch nur 
bis max 32 bit :-(

muss ich das etwa von hand machen?

von Daniel W. (danie)


Lesenswert?

hallo  Karl heinz
danke schon mal für die schnelle AW,

dass das so nicht klappt ist mir schon klar.
ich find nur in der doku nix passendes was ich satt &d oder %i verwenden 
müsste, die schalter die ich gefunden habe gehen bis max 32 bit, aber 
das hilft ja nicht, aber ich bin mir auch nicht sicher ob ich an der 
richtigen stelle suche ...

von hans0815 (Gast)


Lesenswert?

wie wärs mit etwas Pointerarithmetik:

int64_t x = PINA;


int64_t *p64 = &x;

char *pc;

pc = (char *) p64;

PORTB = pc[0];

von Karl H. (kbuchegg)


Lesenswert?

> satt &d oder %i

probier mal %lld

von Daniel W. (danie)


Lesenswert?

sorry ich verstehe zwar halbwegst was du da machst, aber dennoch nicht 
wie mir das weiterhilft?

ausserdem warum sollte ich irgentwelche register beschreiben?

von Daniel W. (danie)


Lesenswert?

werd ich nacher mal testen, muss schnell für 1...2h weg, dann versuch 
ichs mal.
vermute dass das long long dezimal heisst.
das wär dann ja genau das was ich brauche.

danke schon mal.

meld mich dann obs funktioniert hat.

von hans0815 (Gast)


Lesenswert?

Die Register waren nur bei mir zum Test, sonst optimiert doch der 
Compiler alles weg...

Vielleicht macht mein Programm auch niet 100% das was du willst, so 
wie's aussieht willst du ja ASCCII-Darstellung, mein Code erzeugt nur 
ein Byte-Array. Wenn dir das reicht (Die 8 Bytes) dann passt das.

von Karl H. (kbuchegg)


Lesenswert?

> ich hab gerade noch nach den itoa varianten gesucht, die können auch nur
> bis max 32 bit :-(
>
> muss ich das etwa von hand machen?

Ich fürchte fast. In den Header Files bin ich bis auf
den Hinweis auf %lld auch nicht fündig geworden.

Muss es denn unbedingt int64_t sein?

von Daniel W. (danie)


Lesenswert?

also %lld und %lli funktionieren nicht.

da bekomm ich nur mist.

variable: -1 wird als 855703680 ausgegeben, das macht irgentwie keinen 
sinn.

ich werd wohl mal den iterativen hammer auspacken.


int64 muss leider sein, das der datensatz derart groß sein kann

dennoch mal danke

von Daniel W. (danie)


Lesenswert?

@hans0815 :
ja ich brauch nen echten string den ich ausgeben kann.

um die ersten 8 byte zu bekommen wäre eine union wohl lesbarer.

dennoch danke.
grüße danie

von Francesco N. (franceso-)


Lesenswert?

Wenn du das in Hex ausgibst, also erstmal
if (n<0L) n=-n,*str++='-';
Dann kannst du ein sprintf auf den str machen, type "%0X%X" fuer 32bit 
high
und 32bit low byte. Das ist das einfachste.

von Daniel W. (danie)


Lesenswert?

das ist klar,
in hex kein problem.
ich brauchs dummerweisse in dez

ich machs nun iterativ:


rechnen   variable%10     <-   ausgeben
 |        varibale /=10        ^
 |                             |
 |        variable%10     <-   ausgeben
 |        variable /=10        ^
 |                             |
 |        variable%10     <-   ausgeben
 |        variable /=10        ^
 |                             |

 .        .                    .
 .        .                    .
 .        .                    .

 |        variable%10     <-   ausgeben
 |        variable /=10        ^
 |                             |
 |->      variable        ->   ausgeben



damit werden die variablen immer genau eine stelle lang.

man sollte vorher auf >0 abtesten und damit das vorzeichen bestimmen.


vielen dank an alle die mitgedacht haben.
grüße danie

von unscheinbarer WM-Rahul (Gast)


Lesenswert?

20 Stellen?

Peter Dannegger hat in der Codesammlung eine Routine zur Division von 
32Bit-Zahlen veröffentlicht.
Die muß man nur (sollte auch ohne Probleme gehen) auf 64Bit erweitern.

von unscheinbarer WM-Rahul (Gast)


Lesenswert?


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.