Forum: Compiler & IDEs float in char


von tugtug (Gast)


Lesenswert?

Hallo,

ich bekomme über eine CAN Nachricht im 8 Byte langen Datenfeld einen 
float Wert.

Ich möchte diesen gern in ein char[] speichern und mit printf ausgeben.

char puffer[100];

memcpy(puffer, can_dump_frame.data, sizeof(float));
printf("\t Value: %f \n",puffer);


So geht es aber nicht.
Was mache ich falsch?

von tugtug (Gast)


Lesenswert?

ich habe jetzt folgendes probiert:

char puffer[100];

snprintf(puffer, 8, "%f",can_dump_frame.data);
printf("\t Value: %f \n",puffer);

Klappt nicht.

Wie erreiche ich eigentlich das in puffer jedes mal von vorn 
reingeschrieben wird und nicht hinten dran?

von g457 (Gast)


Lesenswert?

> ich bekomme über eine CAN Nachricht im 8 Byte langen Datenfeld einen
> float Wert.

Und wie ist selbiger codiert?

von Andreas M. (moki)


Lesenswert?

Wie ist den can_dump_frame aufgebaut?

Edit: Im übrigen versuchst du ein char (puffer) als float auszugeben. Da 
greifst du mal hübsch auf Speicherbereiche zu, die nicht zu dem char 
gehören und irgendwas drinstehen kann. Wenn du ein char-Array ausgeben 
willst, dann mit %s, aber sei dir BITTEBITTEBITTE sicher, dass am Ende 
des Strings ein "\0" zur Terminierung steht!
Zur Ausgabe am besten den Artikel nochmal durchlesen: 
http://de.wikibooks.org/wiki/C-Programmierung:_Einfache_Ein-_und_Ausgabe 
(Insbesondere den ersten blauen Kasten mit den format-Elementen)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

tugtug schrieb:
> char puffer[100];
>
> snprintf(puffer, 8, "%f",can_dump_frame.data);
> printf("\t Value: %f \n",puffer);
>
> Klappt nicht.

Ist %f der Formatspezifizierer für die Ausgabe von Zeichenketten?

Warum überhaupt Deinen Puffer verwenden?

Warum nicht gleich so?

> printf("\t Value: %f \n", can_dump_frame.data);

von Karl H. (kbuchegg)


Lesenswert?

tugtug schrieb:
> Hallo,
>
> ich bekomme über eine CAN Nachricht im 8 Byte langen Datenfeld einen
> float Wert.

Nö.
Du kriegst zuallererst mal 8 Bytes. Nicht mehr und nicht weniger.
Das diese Bytes aus einem float stammen ist zwar nett und etwas, das du 
weißt, aber im Moment nocht uninteressant. Denn noch sind das einfach 
nur 8 Bytes.

>
> Ich möchte diesen gern in ein char[] speichern und mit printf ausgeben.

Wozu?
Wenn diese Bytes aus einem float stammen, dann möchtest du die doch auch 
in einem float speichern und nicht in einem char[].
Ausserdem: warum char[]? char[] ist für Strings und nicht für floats.
1
  float Wert;
2
3
  memcpy( &Wert, can_dump_frame.data, sizeof(float));
4
  printf("\t Value: %f \n", Wert);

eventuell musst du beim memcpy noch die Adresse &Wert zurecht casten, 
damit sie memcpy akzeptiert.

> So geht es aber nicht.
> Was mache ich falsch?

Du gehst unlogisch vor, überlegst dir nicht was du eigentlich wirklich 
willst und lässt dich von Compiler-Fehlermeldungen auf eine falsche 
Fährte locken. Kurz und gut: du hast dein C nicht ordentlich gelernt. 
Das ist das was du falsch machst.

von Tobias K. (t_k)


Lesenswert?

tugtug schrieb:
.
> Was mache ich falsch?

C programmieren wollen ohne dass Du Dich mit den grundlegenden Konzepten 
auseinandersetzt.

Finde heraus, wie dein 8byte Float-Wert codiert ist, wandle ihn in 
irgendwas um, was mit % in Printf ausgegeben/formatiert werden kann und 
fertsch.
Einfach 8Byte binär als Char ausgeben klappt nicht. Außer du gibst jedes 
Byte einzeln in der Art 0xFF aus - was aber auch wieder nur eine 
Interpretation der binären Daten darstellt (und ich nehme an Du willst 
den Float als 1.234567 anzeigen).

von Steffen R. (steffen_rose)


Lesenswert?

tugtug schrieb:
> ich bekomme über eine CAN Nachricht im 8 Byte langen Datenfeld einen
> float Wert.

Hast Du den Code, wie der float-Wert in die CAN Nachricht abgelegt 
wurde?

Wenn Du sagt, es geht nicht - Was bedeutet das?

Die bereits gegebenen Antworten beziehen sich auf deine Codierung. Mit 
den Hinweise solltest Du eine Übersetzung hinbekommen.
Oder bekommst Du einen falschen Wert? Dann müßtest Du meine 
Eingangsfrage beantwortet. Ein Beispiel hilft vermutlich auch für unser 
Verständnis.

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.