Skip to content
xenforo

Dynamisch Speicher allokieren

Content

Comments

Ja.
Mit dem Zeigertyp und den Standardprozeduren new und dispose.

Danke soweit.

Und wie kann ich damit ein Array beliebiger Größe allokieren?

Die Allokierung funktioniert nicht wie beispielsweise in C, wo man die Groesse des gewuenschten Speichers angibt und dann flexibel damit arbeiten kann.

Du brauchst fuer dynamische Daten in Pascal eine Struktur, auf die Dein Zeiger zeigt. Die Groesse der Struktur ist gleichzeitig auch die Groesse eines Rekords. Mit jedem Aufruf von 'new' bekommst Du einen Rekord und mit Hilfe der Zeigertechnik werden die Rekords zu einer linearen Liste, Binaerbaum etc. aufgebaut.

Also man kann Arrays einfach nicht dynmaisch allokieren und muss mit einer linearen Liste arbeiten.

Schade :( .

Nein, nicht unbedingt. Es hängt von dem Compiler ab.

Ein Programmiersystem wie Delphi stellt die dynamischen Arrays zur Verfügung.

Compiler, die auf Standard Pascal oder Extended Pascal (eine Erweiterung von Standard Pascal) basieren, und (ich bin nicht sicher) das Programmiersystem Turbo Pascal sehen hingegen dynamische Arrays nicht vor. In diesem Fall muss man einen passenden Typ programmieren.

vale

Ja, in Delphi geht es mit getmem und freemem.

Ich möchte aber in Pascal eine Matrix programmieren, wobei ich auf jedes Element gleich schnell zugreifen möchte. Dafür ist ja eine Lineare Liste gar nicht geeignet. Kennt jemand von euch eine passende Hilfsdatenstruktur?

Vielen Dank.

Crazy Chrizzy

Crazy Chrizzy,

muss die Matrix unbedingt in einer dynamischen Datenstruktur abgelegt werden? Wenn Du die maximale Dimension kennst, kannst Du die Datentypen so definieren...

tZeile = 1..ZEILENMAX;
tSpalte = 1..SPALTENMAX;
tMatrix = array [tZeile, tSpalte] of integer;

...Zwar ist die Matrix dann statisch, aber durch die Indizierung sind die Zugriffe immer gleich schnell.

Mit Standard-Pascal hab' ich fuer dynamische Datenstrukturen erstmal keine einfache Loesung parat, da ich mit der Programmiersprache nur im Studium zu tun hatte und keine alltagstauglichen Erfahrungen dazu besitze.

Wenn Du eine Loesung findest, kannst Du die dann hier veroeffentlichen? Wuerde mich sehr interessieren.

Wenn die Matrix strukturierte Objekte enthält, dann ist ein semi-dynamisches Array eine gute und einfache Lösung.
Diese Arrays sind statisch, denn sie enthalten eine feste Anzahl von Elementen. Aber die Allokation des Speichers für die Daten ist dynamisch.

const
MAX = 100;

type
tElem = record
...
end;
tZeiger = ^tElem;
tMatrix = array[1..MAX] of tZeiger;

var
Matrix1 : tMatrix;
i : 0..MAX;

begin

for i := 0 to MAX do
new(Matrix1[i]);
...
for i := 0 to MAX do
Dispose(Matrix1[i]);

Wenn du unbedingt dynamische Arrays willst:

a) Eine modernere Programmiersprache, die beste Lösung

b) Ein Pascal-Dialekt, der die dynamische Arrays vorsieht, z.B. Free Pascal

c) Mit Turbo-Pascal z.B.

type
tZeiger= ^tMatrix;
tMatrix = array[0..0] of integer;

var
PtMatr : tZeiger;
i: integer;

begin

GetMem(PtMatr, 100 * SizeOf(Integer));

for i := 0 to 99 do PtMatr^[i] := i;
for i := 0 to 99 do writeln(PtMatr^[i]);
readln;

FreeMem(PtMatr, 100 * SizeOf(integer));

end.

Inkompatibel zu Standard-Pascal
Eine "compiler directive" {$R-} ist notwendig.

d) eine geiegnete Datenstruktur

Ich kann dir leider nicht helfen, denn es hängt nicht nur von der Matrix ab, sondern auch von dem Problem.

Vielen Dank euch allen!

Ich hatte ein Brett vorm Kopf: Ich war so fest der Meinung, dass getmem und freemem nicht funktioniert in Pascal 2, dass ich es gar nicht erst ausprobiert habe!

:auweia:

Aber es funktioniert ja doch! Danke vale! Noch ne kleine Anmerkung:

[QUOTE]
vale:
for i := 0 to 99 do PtMatr^[i] := i;
[/QUOTE]

Es muss PtMatr[i] := i heißen.

Damit ist das Problem zwar nich nicht gelöst, wie es funktioniert, wenn man getmem nicht zur Verfügung hat, aber ich bin jetzt erstmal glücklich.