Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

Re: MMF und dynamische Arrays?

  Alt 5. Mai 2006, 12:43
fast richtig ^^

Zitat:
array[1..10] of String[255]; erzeugt wahrscheinlich 10 hintereinanderliegende strings der länge 255
inclusive einem Längenbyte (da ja nicht unbedingt alle 255 Chars belegt sein müssen)

es entsteht also ein Record wie dieser:
länge1, char1.1, char1.2 ... char1.255, länge2, char2.1, char2.2 ... char2.255 ... char10.255

Zitat:
array of String[255]; erzeugt im endeffekt ein array of pointer auf strings der länge 255 und diese pointer sind im anderen prozess ungültig
erzeugbt 'nen Pointer mit einem array von x-aufeinanderfolgenden String[255]


und array of String erzeigt einen pointer auf ein Array mit x-aufeinanderfolgenden Pointer, welche auf Strings zeigen


Das Array[1..10] of String[255] kannst du also ohne Problem in die MMF kopieren und da wieder rauskolen
CopyMem(@MyArray, MMF, SizeOf(MyArray)); CopyMem(MMF, @MyArray, SizeOf(MyArray)); Beim Array of String[255] mußt du den Inhalt (nicht den Pointer auf den Inhalt, darum die Referenz auf das erste Arrayelement - MyArray[0]) und die Länge des Arrays kopieren
Delphi-Quellcode:
i := Length(MyArray);
CopyMem(@i, MMF, 4);
CopyMem(@MyArray[0], MMF + 4, i * SizeOf(MyArray[0]));
Delphi-Quellcode:
CopyMem(MMF, @i, 4);
SetLength(MyArray, i);
CopyMem(MMF + 4, @MyArray[0], i * SizeOf(MyArray[0]));
PS: SizeOf(MyArray[0]) ist die größe eines Arrayelements ... entspricht also SizeOf(Typ) von Array of Typ

Beim Array of String könntest zu zwar auch das Array mit seiner Länge und jeden String speichern,
aber da das Array eh nur mit Pointer gefüllt ist, welche drüben geändert werden müßten,
macht es sich einfacher, wenn man nur die Stringinhalte mit ihrer Länge und deren Anzahl speichert,
also
anzahl(integer), Len(integer), Stringinhalt..., Len(integer), Stringinhalt..., Len(integer), ...

Delphi-Quellcode:
i := Length(MyArray);
CopyMem(@i, MMF, 4);
i3 := 4;
For i2 := 0 to i - 1 do Begin
  i4 := Length(MyArray[i2]);
  CopyMem(@i4, MMF + i3, 4);
  Inc(i3, 4);
  CopyMem(@MyArray[i2][1], MMF + i3, Length(MyArray[i2]));
  Inc(i3, Length(MyArray[i2]));
End;
und raus natürlich andersrum ^^

Die Beispiele ... erst in die MMF (was hier einfach mal als Pointer auf das erste Byte der MMF verwendet wurde) und dann wieder raus

[edit]
jupp, massig Fehler ._.


PS: so ein statisches Array[1..10] of String[255]; hat aber auch noch den Vorteil, daß man es auch die ganze Zeit in der MMF lassen kann.
Delphi-Quellcode:
Type TMyArray = Array[1..10] of String[255];
  PMyArray = ^TMyArray;

// und zum lesen/schreuben einfach
PMyArray(MMF)^[x]

// also z.B.
PMyArray(MMF)^[3] := S;
If PMyArray(MMF)^[4] = '123Then
  S := PMyArray(MMF)^[5];
...
$2B or not $2B
  Mit Zitat antworten Zitat