Announcement

Collapse
No announcement yet.

Internes Format von dynamischinen Arrays

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Internes Format von dynamischinen Arrays

    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>

  • #2
    Mit dynamischen Arrays unter D5 habe ich schlechte Erfahrungen gemacht.<BR>
    Bei der Speicherverwaltung kommt Delphi ab einer gewissen Groesse nicht mehr zurecht.<BR>
    Verwende lieber TList. Ein Add und Count ist da schon drin.<BR&gt

    Comment

    Working...
    X