www.mikrocontroller.net

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


Autor: Daniel W. (danie)
Datum:

Bewertung
0 lesenswert
nicht 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

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

Bewertung
0 lesenswert
nicht 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.

Autor: Daniel W. (danie)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Daniel W. (danie)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: hans0815 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie wärs mit etwas Pointerarithmetik:

int64_t x = PINA;


int64_t *p64 = &x;

char *pc;

pc = (char *) p64;

PORTB = pc[0];

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

Bewertung
0 lesenswert
nicht lesenswert
> satt &d oder %i

probier mal %lld

Autor: Daniel W. (danie)
Datum:

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

ausserdem warum sollte ich irgentwelche register beschreiben?

Autor: Daniel W. (danie)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: hans0815 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

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

Bewertung
0 lesenswert
nicht 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?

Autor: Daniel W. (danie)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel W. (danie)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Francesco Na (franceso-)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Daniel W. (danie)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: unscheinbarer WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: unscheinbarer WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

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.