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.
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.
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?
muss die Matrix unbedingt in einer dynamischen Datenstruktur abgelegt werden? Wenn Du die maximale Dimension kennst, kannst Du die Datentypen so definieren...
...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.
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.
Comments
vale
Contributions on this page: 3
View profileJa.
Mit dem Zeigertyp und den Standardprozeduren new und dispose.
Crazy Chrizzy
Contributions on this page: 5
View profileDanke soweit.
Und wie kann ich damit ein Array beliebiger Größe allokieren?
Rene K. aus AB
Contributions on this page: 2
View profileDie 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.
Crazy Chrizzy
Contributions on this page: 5
View profileAlso man kann Arrays einfach nicht dynmaisch allokieren und muss mit einer linearen Liste arbeiten.
Schade :( .
vale
Contributions on this page: 3
View profileNein, 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
Crazy Chrizzy
Contributions on this page: 5
View profileJa, 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
Rene K. aus AB
Contributions on this page: 2
View profileCrazy 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.
vale
Contributions on this page: 3
View profileWenn 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.
Crazy Chrizzy
Contributions on this page: 5
View profileVielen 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.