Dynamischer Datenstruktur



  • ja so ungefähr ich will sowa amchen wie:

    DynStrukt A;
    
    BYTE buf[44];
    
    memcpy(buf,A.rawdata());
    

    die methode "rawdata()" soll dann das objekt als bytesequenz zurückgeebn...

    P.S.: Kann sein das Designfehler drin waren hab das mal schnell hier hin gedüdelt



  • Dann schreibe eine Funktion rawdata(), die den Bytestrom als Array von unsigned char erstellt und kopier die Werte einzeln rein. Dabei kannst Du auch gleich (viel besser als bei structs) dafür sorgen dass Formate und Endianness stimmen.



  • cool.. und wie kann ich es machen, damit das ganze TYPEN unabhängig ist.. wie ich oben mit "union" beschreiben wollte?



  • solange buf ein char array bleibt ist das auch kein problem. sobald buf aber auf eine struktur zeigt würde ich dringend von memcpy() abraten ;). übergebe lieber einen zeiger oder eine referenz der struktur an eine methode, und fülle sie dann entprechend 🙂



  • wieso ist von memcpy abzuraten, von dem abgesehen das dies C ist?



  • Weil du z.B. Zeigerwerte auch einfach mitkopierst. Und die sind unter garantie beim wiedereinlesen nicht mehr korrekt.
    Für POD Typen funktioniert memcpy aber. Du kannst dir dazu übrigens auch das Parameterized Base Class Idiom ansehen.



  • abhängig vom umfang der struktur kann dir das alignment sehr viel kopfzerbrechen bereiten, insbesondere wenn du code portierst und mit fließpunktzahltypen arbeitest.



  • BorisDieKlinge schrieb:

    cool.. und wie kann ich es machen, damit das ganze TYPEN unabhängig ist.. wie ich oben mit "union" beschreiben wollte?

    Wie würdest Du das denn mit der "union" machen?

    Richtig: Du musst Dir irgendwie merken, welcher Typ gerade gültig ist.



  • stimmt , ich müsste mir den tp zusätzlich merken.. so machen es ja die MFC COleVariant typen glaub auch



  • BorisDieKlinge schrieb:

    P.S.: Kann sein das Designfehler drin waren hab das mal schnell hier hin gedüdelt

    Der Designfehler besteht darin, irgend eine Struktur via wildes memcpy kopieren zu wollen. Padding, Aligment und Byte-Order sind ein Problem, hinzukommt der Unterschied von 32Bit- und 64Bit-Laufzeitumgebung.

    Für das Kopieren von Klassen ist der Kopierkonstruktor bzw. der Kopierzuweisungsoperator zuständig, und für das Serialisieren verwendet man spezielle Funktionen, die den Speicherinhalt in ein möglichst plattformneutrales Format umwandelt.


Anmelden zum Antworten