Dynamisches Array

Hallo,
weiß zufällig jemand, wie man in TP 7 ein dynamisches Array machen kann?
Also ein Array, dessen Größe z.B. von 1 bis Variable reicht. Der Wert der Variable wird aber eben erst vom User eingegeben.
Grüße und Danke im Voraus
Manuel

Das hatte der Compiler nicht nativ unterstützt. Ab TP/BP 7 stand TCOllection zur Verfügung:

type
TestPTR = ^Byte;

var
Tptr : TestPTR;

begin
GetMem(Tptr, 10); // ein array mit 10 Byte-Elementen
Tptr[1] := 45; // etc.
end.

Hallo,

mit den Befehlen „GetMem“ bzw. „AllocMem“ und „FreeMem“ kannst du Speicher dynamisch reservieren und freigeben. Für was du den Speicher dann benutzt, ist dir überlassen. Entscheidend ist, daß man eine Adresse bekommt, die auf den reservierten Speicherbereich zeigt („normalerweise“ sind das ja die Variablen). Der Trick ist, einen typisierten Zeiger zu deklarieren, über den du den Speicherbereich wie ein Array benutzen kannst. Das ist am Beispiel unten gezeigt. Beachste: Die Indizes dynamischer Arrays beginnen zwangsläufig immer bei Null und gehen bis n-1 (n=Anzahl der Elemente). Die benötigte Speichergröße, die reserviert werden muß, ist das n-fache des Speichers, das ein Element benötigt (kommt auf den Datentyp an; läßt sich mit der Funktion „SizeOf“ ermitteln). Die Bereichsüberprüfung muß ausgeschaltet sein, sonst meldet der Compiler einen Fehler und man muß selbst Sorge tragen, daß man nicht versucht, auf Elemente zuzugreifen, die gar nicht mehr Teil des Arrays sind (kann Schutzverletzungen und ähnlich häßliche Fehler verursachen).

type
 TArray = Array[0..0] of _Datentyp;  
 PArray = ^TArray;  
var  
 A:stuck\_out\_tongue:Array;  
 n:Integer; {nur so als Anzahl der Elemente im Array}  
 i:integer;   
begin  
 GetMem(A, n\*SizeOf(Datentyp);  
 for i:=0 to n-1 do A^[i] := irgendwas;  
 ...  
 FreeMem(A);  
end;_  

LG
Jochen

Hallo Manuel,

das sind 2 Probleme:

  1. Konstruktion: mit Getmem, siehe Beispiel.
  2. Aufruf in Prozedur: Parameter als offener Array, siehe Beispiel.

program oarray;
{$APPTYPE CONSOLE}

type TIntArray = array [0…1] of integer; { typ für den array }
PIntArray = ^TIntArray; { pointer darauf }

var pMyArray : PIntArray;
i : integer;

{ z.B. 25 Eintraege }

{ prozedur mit offenem array }
procedure UseMyArray (var mA : array of integer; l : integer);
begin
end;

begin
GetMem (pMyArray,25 * SizeOf (integer));
for i := 0 to 25 do pMyArray[i] := i*i;
UseMyArray (pMyArray^,25);
end.

Habe das Programm allerdings nicht weiter getestet. Leider zerhackt der unsägliche Antworteditor hier alles, was ordentlich formatiert ist.

Gruss Reinhard

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

  1. Es muss natürlich 26 * SizeOf heissen.
  2. Da ein Pointertyp definiert wurde, braucht man die Definition offener arrays nicht unbedingt.

Reinhard

Hallo,

wie Du siehst, ist die Sache mit dyn. Arrays bischen
schwierig und auch etwas unsicher.
Wenn möglich mache das Array so groß, wie max. sein
muß und deklariere es statisch. Du sparst Dir evtl.
Probleme.

So weit ich mich erinnern kann, muß man allerdings beachten,
daß ein Array nicht größer als ein Segment sein darf
(also 64KB).
Gruß Uwi

weiß zufällig jemand, wie man in TP 7 ein dynamisches Array
machen kann?
Also ein Array, dessen Größe z.B. von 1 bis Variable reicht.
Der Wert der Variable wird aber eben erst vom User eingegeben.
Grüße und Danke im Voraus
Manuel

Hallo,
Vielen Dank für die Antworten!
Grüße
Manuel

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]