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!
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
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.
Dirk B. schrieb: > Und erklär mal, warum du die +1 hinter dem strlen hast. keine Ahnung, das hab ich halt kopiert
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; }
fragant schrieb: > Habe es nun mal mit der Funktion snprintf gemacht. ist aber immer noch falsch. Hast du es denn mal getestet?
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 vorwerfen fragant 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.
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.