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;
}
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.
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!
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?)
>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.
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.
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
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...)
@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.
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.
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;
}
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;
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?
@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;-)
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 vorwerfenfragant schrieb:> Also kompilieren lies es sich nach einer kleinen Änderung.
..
> float value = 1.25;
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.
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.