Einzelnen Beitrag anzeigen

kmma

Registriert seit: 26. Jul 2010
16 Beiträge
 
Delphi 2 Desktop
 
#8

AW: Verständnisfrage offene Arrays, move und setlength

  Alt 7. Apr 2023, 18:19
Anstatt uns über den Sinn des ganzen im Dunkeln zu lassen, könntest du uns einfach erleuchten und wir finden eine andere Lösung.

Zitat:
move(x, R, 8);
Wer das macht, gehört eh bestraft.
Das ist einfach Herrlich. Danke Himitsu.
Ich würde aber weitergehen, das ist mutwillige Zerstörung von fremden Eigentum und gehört angekreidet. Zum Schluss erkennen dann wieder die Virenscanner alle Delhi Programme als Viren. Nur weil ein Verrückter wild im Speicher rumschreibt.
Inwiefern zerstöre ich fremdes Eigentum? Nach meinem Verständnis hat die Variable R die Größe 8 Byte und wenn ich da 8 Byte reinschiebe, was zerstöre ich dann?

Ich vruche es einmal zu erklären wie ich auf das Problem komme.
Ich bekomme aus einer externen Quelle, auf die ich keinen Einfluss habe (DLL), Datensätze, die wie folgt (vereinfacht) aufgebaut sind.
Delphi-Quellcode:
type TDatensatz = packed record
    Zahl1: integer;
    Beschreibung1: TStringlist;
    Zahl2: integer;
    Beschreibung2: TStringlist;
    ...
end;
In "Beschreibung" sind dann in jedem String im Klartext (ist eben so, kann ich nicht ändern) Untertypen beschreiben, z.B. "R=5; G=7; B=12"; "R=23; G=3; B=44" etc.

Um damit weiterarbeiten zu können möchte ich diese Datentypen in die folgende Struktur umwandeln:
Delphi-Quellcode:
type TUntertyp1 = packed record
    R: integer;
    G: integer;
    B: integer;
end;
type TUntertyp1Array = array of TUntertyp1;
type TMeinDatensatz = packed record
    Zahl1: integer;
    Untertyp1: TUntertyp1Array
    ...
end;
Da die Größe einer Stringlist und die Größe eines Array of TUnteryp (im packed Record) jeweils 4 Byte sind war meine Idee eben, die Daten aus TDatensatz zuerst 1:1 (per Move) in eine Veriable vom Typ TMeinDatensatz zu schreiben (sizeof(TMeindatensatz) und sizeo(TDatensatz) sind gleich groß) und dann die Größe von Untertyp1 auf die Anzahl der Strings in der Stringlist (Beschribung) zu setzen und dann im Untertyp die Felder mit einem Parser zu ermitteln. Dass ich nach dem kopieren der Daten nicht direkt auf den Untertyp zugreifen kann ist mir schon klar.
Die Frage ist eben, ob ich mit
Delphi-Quellcode:
var MeinDatensatz: TMeindatensatz;
move(Datensatz, Meindatensatz, sizeof(TMeindatensatz));
fillchar(MeinDatensatz.Untertyp1, 4, 0);
setlength(MeinDatensatz.Untertyp1, Datensatz.Beschreibung.count);
...
Irgendwas verbotenes mache oder ob das geht.

In diesem vereinfachten Besipiel könnte ich natürlich einfach die direkten Zuweisungen machen
Delphi-Quellcode:
MeinDatensatz.Zahl1 := Datensatz.Zahl1;
setlength(Meindatensatz.Untertyp1; Datensatz.Beschreibung.count);
...
In Wicklichkeit sind die Typen aber deutlich umfangreicher so dass mir eben die o.g. Idee als Vereinfachung gekommen ist.
  Mit Zitat antworten Zitat