Forum: Mikrocontroller und Digitale Elektronik Problem: Float in String umwandeln mit memcpy


von fragant (Gast)


Lesenswert?

Hallo,

bei mir funktioniert die folgende Funktion nicht, es wird mir eine 
Fehlermeldung bei strlen(&value)+1 angezeigt, dass hier ein Wert dieses 
Typs nicht stehen kann.

#include <stdio.h>
#include <string.h>

int main ()
{
  char buffer[8];
  int value = 1.25;

  memcpy ( buffer, &value, strlen(&value)+1 );
  return 0;
}

von Peter D. (peda)


Lesenswert?


von Harry L. (mysth)


Lesenswert?


von gunni (Gast)


Lesenswert?

Wer hier noch antwortet ist ein Trollfütterer!

von Sebastian S. (amateur)


Lesenswert?

Für mich sieht das aus, als hätte jemand einfach ein paar Elemente aus 
der Programmiersprache C genommen und diese nach eigenem Gusto 
hintereinandergeschrieben.
Also null Ahnung.

  int value = 1.25;
Hier wird eine lokale Variable die explizit Ganzzahlen aufnehmen kann 
definiert und sie dann mit einer Fließkommazahl zu initialisieren. Da 
graust es jedem "vernünftigem" Compiler.

  memcpy ( buffer, &value, strlen(&value)+1 );
Keine Ahnung, was das soll.
Der Kopierfunktion wird der Anfang eines Zielpuffers übergeben - so 
weit, so gut.
Als nächstes wird eine Quelladresse übergeben - kann man machen.
Im dritten Teil, geht alles den Bach runter. strlen () erwartet einen 
String und keine Ganzzahl. Eine Ganzzahl hat aber keine Länge höchstens 
einen vernüftigen Wert bei sizeof. Auch gibt es bei einer Ganzzahl keine 
lesbaren Zeichen, die zu kopieren Sinn machen würde. Also wenn da 
irgendetwas Lesbares herauskommen würde, so hätte Väterchen Zufall seine 
Finger im Spiel. Was das "+1" soll, erschließt sich mir auch nicht.

Schau Dir - um Himmels Wilhelm - mal ein C-Buch an.

von Sheeva P. (sheevaplug)


Lesenswert?

fragant schrieb:
> Hallo,
>
> bei mir funktioniert die folgende Funktion nicht, es wird mir eine
> Fehlermeldung bei strlen(&value)+1 angezeigt, dass hier ein Wert dieses
> Typs nicht stehen kann.
>
> #include <stdio.h>
> #include <string.h>
>
> int main ()
> {
>   char buffer[8];
>   int value = 1.25;
>
>   memcpy ( buffer, &value, strlen(&value)+1 );
>   return 0;
> }

Die Funktion memcpy(3) kopiert einen Speicherbereich in einen anderen. 
Sie macht dabei keinerlei Konvertierung von Daten oder Datentypen.

Darüber hinaus ist "1.25" ganz sicher keine Ganzzahl, mithin: kein int, 
sondern eine Fließkommazahl, also: ein float oder double.

Ohne Dir zu nahe treten zu wollen, möchte ich Dir empfehlen, ein C-Buch 
oder C-Tutorial durchzuarbeiten. Viel Spaß und Erfolg!

von MaWin (Gast)


Lesenswert?

fragant schrieb:
> bei mir funktioniert die folgende Funktion nicht

Bei mir auch nicht.

Das ist normal.

http://www.ime.usp.br/~pf/Kernighan-Ritchie/C-Programming-Ebook.pdf

von fragant (Gast)


Lesenswert?

Sebastian S. schrieb:
> Hier wird eine lokale Variable die explizit Ganzzahlen aufnehmen kann
> definiert und sie dann mit einer Fließkommazahl zu initialisieren. Da
> graust es jedem "vernünftigem" Compiler.

Tut mir Leid. Habe den Code gerade nicht hier und habe mich nun auf die 
schnelle vertippt.

Sheeva P. schrieb:
> Die Funktion memcpy(3) kopiert einen Speicherbereich in einen anderen.

Genau so habe ich mir das gedacht. Stimmt es nicht, dass meine 1.25 dann 
in den buffer geschrieben werden?

Sebastian S. schrieb:
> Eine Ganzzahl hat aber keine Länge höchstens
> einen vernüftigen Wert bei sizeof. Auch gibt es bei einer Ganzzahl keine
> lesbaren Zeichen, die zu kopieren Sinn machen würde.

Also verstehe ich das richtig, dass ich das mit dieser Funktion nicht 
hinbekommen werde? Auch wenn ich sizeof verwende (wie wird sizeof bei 
einer float z.B. 1.25 berechnet? 3?)

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

snprintf ...

von Sebastian S. (amateur)


Lesenswert?

>Genau so habe ich mir das gedacht. Stimmt es nicht, dass meine 1.25 dann
>in den buffer geschrieben werden?
Du bekommst die 1.25 schon nicht in die Variable value. Also kannst Du 
sie auch nicht herauskopieren.
Selbst wenn Du eine Variable für Fließkommazahlen anlegen würdest, so 
würde da kein "lesbarer" Wert drin stehen.

von fragant (Gast)


Lesenswert?

Ich wäre euch dankbar, wenn ihr mir ein paar Tipps geben könntet anstatt 
nur auf die C-Grundlagen zu verweisen. Dort findet man nur folgende 
Definition.

void * memcpy ( void * destination, const void * source, size_t num );

destination ist ein Pointer auf das Zielarray
source ist ein pointer auf die Quelle
size_t ist die Anzahl der zu kopierenden Bytes

memcpy (buffer, &value, sizeof(value));

Ich weiß jetzt nicht, warum das nicht funktionieren soll. Als erstes der 
Pointer auf das Array Buffer, dann die Adresse von der Quelle und am 
Ende die Anzahl an Bytes von der Quelle.

von Thomas K. (thomas_kn)


Lesenswert?

Hallo,

> Ich wäre euch dankbar, wenn ihr mir ein paar Tipps
> geben könntet anstatt nur auf die C-Grundlagen zu
> verweisen. Dort findet man nur folgende Definition.

Die Tips waren schon zu Hauf da und der entscheidende auch: snprintf
Jetzt schau Dir Beispiele dazu oder zu "sprintf" an und schon
wirst Du verstehen. Dann liest Du auch einmal die Beschreibung zu 
"memcpy" und liest wie Fließkommazahlen im Speicher abgelegt werden 
(Stichwort IEEE754), dann wirst Du besser verstehen. Der Tip mit den 
Grundlagen war also sehr gut gewesen.

Gruß
Tom

von Jobst Q. (joquis)


Lesenswert?

Kopieren kannst du schon so. Aber ein Int bleibt dabei ein Int, ein 
Float ein Float, usw.

Zum Konvertieren in einen String gibt es andere Funktionen. (itoa, 
sprintf,snprintf...)

von Sebastian S. (amateur)


Lesenswert?

@fragant

memcpy (buffer, &value, sizeof(value));

Funktioniert - so!


Kopierst Du aber eine Fließkommazahl in einen Text-/Zeichenpuffer so ist 
das Ergebnis bestenfalls lustig. Aber, per Definition nicht falsch.

Da sollte auch Dein Compiler mitspielen.

Aber im Titel hast Du ja behauptet, dass Du das gar nicht willst!

Da steht nämlich: "Re: Problem: Float in String umwandeln mit memcpy"

Zum Thema anschauen:
Memcpy macht genau das, was der Name sagt. Es wird ein Speicherbereich 
in einen anderen kopiert. Sonst aber nichts! An keiner Stelle wird 
behauptet, dass irgendeine Konvertierung stattfindet.

Hierzu würde ich mir mal die Funktion: sprintf () oder seine Kumpels 
ansehen.

von Dirk B. (dirkb2)


Lesenswert?

fragant schrieb:
> Ich wäre euch dankbar, wenn ihr mir ein paar Tipps geben könntet anstatt
> nur auf die C-Grundlagen zu verweisen

Bevor du in einem C-Buch/Kurs/Tutorial zu memcopy kommst, hast du schon 
den Unterschied zwischen int und float kennen gelernt und auch schon mal 
printf benutzt.

Und erklär mal, warum du die +1 hinter dem strlen hast.

von Fragant (Gast)


Lesenswert?

Dirk B. schrieb:
> Und erklär mal, warum du die +1 hinter dem strlen hast.

keine Ahnung, das hab ich halt kopiert

von fragant (Gast)


Lesenswert?

Sebastian S. schrieb:
> Da steht nämlich: "Re: Problem: Float in String umwandeln mit memcpy"

Sebastian S. schrieb:
> Zum Thema anschauen:
> Memcpy macht genau das, was der Name sagt. Es wird ein Speicherbereich
> in einen anderen kopiert. Sonst aber nichts! An keiner Stelle wird
> behauptet, dass irgendeine Konvertierung stattfindet.

Danke für die Erklärung.

Habe es nun mal mit der Funktion snprintf gemacht.

int main ()
{
  char buffer[8];
  int value = 1.25;

  snprintf(buffer,sizeof(value), "%f",value);
  return 0;
}

von Peter II (Gast)


Lesenswert?

fragant schrieb:
> Habe es nun mal mit der Funktion snprintf gemacht.

ist aber immer noch falsch.


Hast du es denn mal getestet?

von fragant (Gast)


Lesenswert?

Peter II schrieb:
> ist aber immer noch falsch.
>
> Hast du es denn mal getestet?

Also kompilieren lies es sich nach einer kleinen Änderung.

fragant schrieb:
> int value = 1.25;

Hier ist mir nochmal der gleiche Flüchtigkeitsfehler unterlaufen.
float value = 1.25;

von Peter II (Gast)


Lesenswert?

fragant schrieb:
> Hier ist mir nochmal der gleiche Flüchtigkeitsfehler unterlaufen.

das ist minderst noch ein fehler drin.

> Also kompilieren lies es sich nach einer kleinen Änderung.
warum zeigt du nicht den umgewandelten String einfach mal an?

von Sebastian S. (amateur)


Lesenswert?

@fragant
Eine gewisse Lernresistenz kann man Dir wirklich nicht absprechen.

Keine Ahnung wie oft darauf hingewiesen wurde, dass:
  int value = 1.25;
nix taugt, aber das ist natürlich kein Grund etwas zu ändern...

Vielleicht solltest Du das ganze mal Deinem Compiler vorwerfen und nicht 
gleich das Ergebnisfenster schließen, sondern Dir mal ansehen, was da 
steht.

Muss aber nicht sein;-)

von Jimmy W. (Gast)


Lesenswert?

Sebastian S. schrieb:
> Keine Ahnung wie oft darauf hingewiesen wurde, dass:
>   int value = 1.25;
> nix taugt, aber das ist natürlich kein Grund etwas zu ändern...

fragant schrieb:
> Hier ist mir nochmal der gleiche Flüchtigkeitsfehler unterlaufen.
> float value = 1.25;

Sebastian S. schrieb:
> Vielleicht solltest Du das ganze mal Deinem Compiler vorwerfen

fragant schrieb:
> Also kompilieren lies es sich nach einer kleinen Änderung.
..
> float value = 1.25;

von fragant (Gast)


Lesenswert?

Peter II schrieb:
> fragant schrieb:
>> Hier ist mir nochmal der gleiche Flüchtigkeitsfehler unterlaufen.
>
> das ist minderst noch ein fehler drin.
>
>> Also kompilieren lies es sich nach einer kleinen Änderung.
> warum zeigt du nicht den umgewandelten String einfach mal an?

Habe auf dem aktuellen Rechner keinen Compiler drauf mit dem ich das 
testen kann. Werde ich in Kürze darum kümmern.

Mich würde es trotzdem interessieren, wo nun der Fehler liegen soll.

von Peter II (Gast)


Lesenswert?

fragant schrieb:
> Mich würde es trotzdem interessieren, wo nun der Fehler liegen soll.

sizeof(value)

ergibt keinen sinn.

schau in der doku nach, was der Parameter angibt.

von Dirk B. (dirkb2)


Lesenswert?

@fragant

Welche Programmiersprache(n) hast du den vor C kennen gelernt?

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.