struct* in char* umwandeln
-
Hallo,
ich habe folgendes Problem:
Ich möchte einen struct * pStructPtr in einen char * pCharPtr umwandeln.
Ich habs mit castenpCharPtr = (char*)pStructPtr;versucht, weil dies bisher mit andersartigen Pointern (z.B. int* in char*) gut geklappt hat.
Aber das geht nicht. Nach der Umwandlung zeigt die in pCharPtr enthaltene Adresse ins Leere.Auch ne Internetrecherche hat bisher nix ergeben

(PS: Für was ich´s brauch (nur wen´s interessiert): Ich habe in einem struct einige double und char Werte. Diese möchte ich anhand von Sockets mit der SEND-Fkt über eine TCP/IP-Schnittstelle schicken. Da SEND [send(socketClient,pCharPtr,sizeof(double),0);] (soweit ich weiß) nen Char-Pointer erwartet, will ich den Struct-Pointer eben in einen solchen umwandeln. Hatte zum Testen nen Integerarray erstellt - mit dem gings einwandfrei)
Pi
-
Pi schrieb:
Aber das geht nicht. Nach der Umwandlung zeigt die in pCharPtr enthaltene Adresse ins Leere.
Nein, zeigt sie nicht. Sie zeigt in den Speicher. Und zwar den gleichen auf den pStructPtr zeigt. Ausserdem ist "das geht nicht" keine Fehlerbeschreibung. f'`8k
AutocogitoGruß, TGGC (Was Gamestar sagt...)
-
@TGGC:
Vielen Dank für die überraschend ausführliche Hilfe.Mit
Pi schrieb:
Nach der Umwandlung zeigt die in pCharPtr enthaltene Adresse ins Leere.
meinte ich, dass die in pStructPtr enthaltene Adresse auf ein double-Feld zeigt, in der (z.B.) 50.5 steht. Nach der Umwandlung zeigt die selbe Adresse, die nun in pCharPtr steht auf ein Feld in dem eine Null (0) steht.
Das ist nicht das von mir erwartete, bzw. erhoffte Ergebnis.Mache ich einen Fehler bei der Umwandlung?
-
Pi schrieb:
@TGGC:
Vielen Dank für die überraschend ausführliche Hilfe.Mit
Pi schrieb:
Nach der Umwandlung zeigt die in pCharPtr enthaltene Adresse ins Leere.
meinte ich, dass die in pStructPtr enthaltene Adresse auf ein double-Feld zeigt, in der (z.B.) 50.5 steht. Nach der Umwandlung zeigt die selbe Adresse, die nun in pCharPtr steht auf ein Feld in dem eine Null (0) steht.
Das ist nicht das von mir erwartete, bzw. erhoffte Ergebnis.Mache ich einen Fehler bei der Umwandlung?
Ja. Du hast falsche Erwartungen bzw. Hoffnungen. f'`8k
AutocogitoGruß, TGGC (Was Gamestar sagt...)
-
Wenn du pCharPtr dereferenzierst, erhältst du halt einen char-Wert.
-
Zeige doch mal bitte dein struct!
-
Dafür gibt es doch schönere Lösungen, als zu versuchen, das ganze Struct zu casten.
Du kannst doch auch einfach die Member des Struct einzeln umwandeln. Perfomancetechnisch ist das zwar ein wenig unterschiedlich, aber da du das Zeug sowieso über einen Socket versendest, macht das bißchen Zeit für die Umwandlung auch keinen Kohl fett.
-
struct Heading { double headingDegree; double magDiff; char magErrDir; };Ich weiß. Das mit den Membern einzeln verschicken geht (so hab ichs gemacht weil ich nicht weiterkam) . Mich würde es nur interessieren warum ich das mit der struct-casterei nicht hinbekomme.
-
Zum verschicken von Daten solltest du auf gar keinen Fall dein struct nach char casten. Der Zielrechner kann die verschickten Daten nämlich nicht interpretieren, weil die Art und Weise wie das struct im speicher liegt nicht standardisiert ist. Das kann (und wird) von Maschine zu Maschine und von Compiler zu Compiler unterschiedlich sein, sogar unterschiedliche Compilereinstellungen erzeugen unterschiedliche Speichermuster. Mach es wie It0101 sagt und wandel deine Member einzeln in char[] um.
-
Ich finde ja Codetags geben dem noch eine besondere Note.
Was funktioniert denn nu nicht an (Pseudocode):
Heading head; head = ... send( fd, &head, sizeof(head) ); recv( fd, &head, sizeof(head) );
-
Einfach nen stringstream genommen, den ganzen Krempel da rein gebastelt mit nem Trennzeichen und gut ist. Alles andere könnte unschön werden.
-
SeppJ schrieb:
Zum verschicken von Daten solltest du auf gar keinen Fall dein struct nach char casten. Der Zielrechner kann die verschickten Daten nämlich nicht interpretieren, weil die Art und Weise wie das struct im speicher liegt nicht standardisiert ist. Das kann (und wird) von Maschine zu Maschine und von Compiler zu Compiler unterschiedlich sein, sogar unterschiedliche Compilereinstellungen erzeugen unterschiedliche Speichermuster. Mach es wie It0101 sagt und wandel deine Member einzeln in char[] um.
Ok, ihr habt mich überzeugt

Ich löse die Member einzeln auf und schick sie per Stringstream übers Netzwerk.
(´n Versuch wars Wert
)Trotzdem erstmal Danke.