Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Array in einer Prozedur erstellen


Mortal-Shadow - Di 09.09.08 15:20
Titel: Array in einer Prozedur erstellen
Hi,
ich brauche in meiner Prozedur einen Array.
Dessen Größe wird aber erst vor dem jeweiligen Aufruf der Prozedur bekannt.
Ich hatte gehofft das etwas in der Art funktionieren würde:

Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.myprocedure(const Arraygroesse: Integer);
var
myarray: Array[1..Arraygroesse] of Integer;
{....}

Leider lässt der Compiler das nicht zu. (Warum eigentlich nicht - er muss doch mit jedem Aufruf nur einen konstanten Bereich reservieren.)
Gibt es noch eine andere möglichkeit außer das ganze
a) per Stringlist ( .add in einer Schleife bis groß genug und dann per Strtoint() und inttostr() damit arbeiten)
b) per sehr großem Array, der halt unnötig Platz verbraucht, falls die Prozedur nur wenig Zahlen speichern muss.

zu tun?
Gruß, MS


Moderiert von user profile iconNarses: Topic aus Dateizugriff verschoben am Di 09.09.2008 um 15:49


elundril - Di 09.09.08 15:27

das was du suchst nenntsich dynamisches Array. Hier [http://www.christian-stelzmann.de/artikel/crashkurs.htm#dynamischearrays] gibts ein kapitel darüber.

lg elundril


Boldar - Di 09.09.08 16:31

oder mit pointern


Calculon - Di 09.09.08 16:47
Titel: Re: Array in einer Prozedur erstellen
user profile iconMortal-Shadow hat folgendes geschrieben:
[..] Leider lässt der Compiler das nicht zu. (Warum eigentlich nicht - er muss doch mit jedem Aufruf nur einen konstanten Bereich reservieren.) [..]

Das Stichwort hast du selber schon gegeben mit "konstanter Bereich". Beim Kompilieren von statischen arrays ist die Größe in deiner Executable -wie der Name schon sagt- statisch festgelegt und nicht mehr variabel. Das ist halt so! Wenn du dynamische arrays benutzen willst, folge dem Link von user profile iconelundril. FORTRAN™ kann Speicher gar nicht dynamisch anfordern. Da musst du vor dem Kompilieren wissen, wie groß deine Felder sein werden. Btw.: Das geht AFAIK:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
const
  ARRAYGROESSE = 40;

[..]

procedure TForm1.MyProcedure;
var
  MyArray: array [1..ARRAYGROESSE] of integer;


Moderiert von user profile iconCalculon: Topic für kritisch mit bedenklichem Inhalt befunden am Di 09.09.2008 um 16:46
:lol: Toll! Ich habe einen neuen Tag gelernt! Damit lässt sich bestimmt viel Unfug anrichten. Nein liebe Mods mach' ich natürlich nicht!!


Mortal-Shadow - Di 09.09.08 20:49

Dynamischer Array klingt doch gut.
Vielen Dank.