Dynamische Arrays funktionieren ja so, dass bei einem Aufruf von SetLength() soviel Speicher alloziert wird, wie das Array benötigt (also Länge des Array * Elementgröße). Der Zugriff auf ein Speicherelement erfolgt mit der Formel
Startadressse + Index * Elementgröße. Bei jedem Aufruf von SetLength wird nun das Array an einen anderen Speicherplatz kopiert und der alte Speicher freigegeben. Pack das ganze in eine schöne Klasse und das sollte es gewesen sein.
OK, du musst für jeden Datentyp eine eigene Implementierung machen, aber das dürfte weitgehend mit C&P zu lösen sein.
So mal ein Beispiel, wie der Umgang mit diesem Objekt wäre. Die Daten selbst wären über einen Pointer abgespeichert, außerdem muss die Anzahl der Einträge gespeichert werden.
Delphi-Quellcode:
//die Klasse heißt TDynArray
myArray := TDynArray.Create(1); //Array mit der Länge erzeugen, im Konstruktor Aufruf von SetLength
myArray[0] := myVar; //myVar an Startposition + 0 schreiben
myArray.SetLength(2); //jetzt werden die ganzen Daten des Array an eine neue Speicherstelle kopiert
myArray.Free;
SetLength würde folgendes tun:
- NeueLänge * Elementgröße Bytes Speicher allozieren
- AlteLänge * Elementgröße Bytes ausgehend von DataPointer in neuen Speicher kopieren
- DataPointer mit alter Länge freigeben
- DataPointer bekommt die Adresse des neuen Speicherbereichs
- Fallunterscheidung: bei Länge 0 kein Kopieren nötig.
Der Zugriff auf ein Element:
- Die Adresse Index * Elementgröße + Datapointer dereferenzieren und in entsprechenden Typ casten
So könnte man das lösen.