Ich will eine Unit schreiben, die mir mit dynamischen Arrays helfen soll. Nun will ich diese manipulieren, ohne den wirklichen Typ zu kennen.<br>
<br>
TYPE AInteger = ARRAY OF Integer<br>
PROCEDURE AddElement(VAR Arr, Item); // Beispiel<br>
BEGIN<br>
???<br>
END;<BR>
<br>
Für AddElement habe ich bereits funktionierenden Code (unten mehr dazu), da ich schon etwas über den internen Aufbau von Arrays weiß:<br>
<UL>
<LI>Es gibt 10 Bytes noch vor(!!!) dem eigentlichen Pointer
<li>Die letzten 4 Bytes ist ein Integer, dass die Anzahl der Elemente angibt. Zugreifen darauf kann ich mit PInteger(Integer(Arr)-4)^
<li>Ich vermute, die Bytes 3 - 6 ist die Größe des belegten Speichers für das Array.
</UL>
Wozu sind die restlichen 2 Bytes? Wie berechnet der Compiler, wieviel Speicher er belegen muss? Wie kann ich Arrays allgemein manipulieren?<br>
Mein Code der Funktion dort oben sieht so aus:<br>
PROCEDURE SetCountItems(VAR Arr; Count: Integer); <br>
BEGIN<br>
IF Length(AByte(Arr)) > 0 THEN<br>
BEGIN<br>
PInteger(Integer(Arr) - 4)^ := Count;<br>
END;<br>
END;<br>
<br>
FUNCTION Add(VAR Arr; CONST Item; ItemSize: Integer): Integer;<br>
VAR<br>
A, Lang: Integer;<br>
BEGIN<br>
SetCountItems(Arr, Length(AByte(Arr)) * ItemSize);<br>
Lang := Length(AByte(Arr));<br>
SetLength(AByte(Arr), Lang + ItemSize);<br>
FOR A := 0 TO ItemSize - 1 DO<br>
BEGIN<br>
AByte(Arr)[Lang + A] := TMaxByte(Item)[A];<br>
END;<br>
SetCountItems(Arr, (Lang DIV ItemSize) + 1);<br>
Result := (Lang DIV ItemSize) + 1;<br>
END;<br>
Weiss einer mehr?<br>
<br>
TYPE AInteger = ARRAY OF Integer<br>
PROCEDURE AddElement(VAR Arr, Item); // Beispiel<br>
BEGIN<br>
???<br>
END;<BR>
<br>
Für AddElement habe ich bereits funktionierenden Code (unten mehr dazu), da ich schon etwas über den internen Aufbau von Arrays weiß:<br>
<UL>
<LI>Es gibt 10 Bytes noch vor(!!!) dem eigentlichen Pointer
<li>Die letzten 4 Bytes ist ein Integer, dass die Anzahl der Elemente angibt. Zugreifen darauf kann ich mit PInteger(Integer(Arr)-4)^
<li>Ich vermute, die Bytes 3 - 6 ist die Größe des belegten Speichers für das Array.
</UL>
Wozu sind die restlichen 2 Bytes? Wie berechnet der Compiler, wieviel Speicher er belegen muss? Wie kann ich Arrays allgemein manipulieren?<br>
Mein Code der Funktion dort oben sieht so aus:<br>
PROCEDURE SetCountItems(VAR Arr; Count: Integer); <br>
BEGIN<br>
IF Length(AByte(Arr)) > 0 THEN<br>
BEGIN<br>
PInteger(Integer(Arr) - 4)^ := Count;<br>
END;<br>
END;<br>
<br>
FUNCTION Add(VAR Arr; CONST Item; ItemSize: Integer): Integer;<br>
VAR<br>
A, Lang: Integer;<br>
BEGIN<br>
SetCountItems(Arr, Length(AByte(Arr)) * ItemSize);<br>
Lang := Length(AByte(Arr));<br>
SetLength(AByte(Arr), Lang + ItemSize);<br>
FOR A := 0 TO ItemSize - 1 DO<br>
BEGIN<br>
AByte(Arr)[Lang + A] := TMaxByte(Item)[A];<br>
END;<br>
SetCountItems(Arr, (Lang DIV ItemSize) + 1);<br>
Result := (Lang DIV ItemSize) + 1;<br>
END;<br>
Weiss einer mehr?<br>
Comment