Pascal-progr. mit mehr als 64 kB variab

Hi

dies ist mein erster versuch über 64 kB variab. in einem PASCAL-p.
zu benutzen. natürlich geht es nicht.

PASCAL akzeptiert das program, compiled es, startet es, und stürzt
ab. der fehler tritt nicht immer zur gleichen zeit auf, manchmal
kommt er bis zum 60 variabelaufruf.

das extremste war bis jetzt eine meldung von emm386, sie stellte mich
vor die wahl „continue or reboot ?“. in beiden fällen stürtz die
machine ab.

das program :

program test_mem;

type map = array [0…64000] of byte;

var maps : array [1…2] of ^map;
j,i,k:byte;
h,m,hs,s:word;

begin
for i:=1 to 2 do begin
for k:=0 to 64000 do begin
maps[i]^[k]:=0;
write (k,’ ');
end;
writeln ('next map ',i);
end;
end.

wo ist der fehler ?

danke
laurent

Um einen Speicherbereich zu nutzen, der auf dem Heap ist, mußt Du ihn zuerst mit New§ alloziieren. Ansonsten zeigt der Pointer auf einen undefinierten Speicherbereich.

for i:=1 to 2 do begin
New(maps[i]); { eingefügt }
for k:=0 to 64000 do begin
maps[i]^[k]:=0;
write (k,’ ');
end;
writeln ('next map ',i);
end;
end.

Am Ende, wenn Du den Speicherbereich nicht mehr brauchst, solltest Du ihn mit Dispose§ freigeben.

–Mathias Ricken

program test_mem;

type map = array [0…64000] of byte;

Hallo!

Als ich Deine Array-Deklaration gesehen habe, ist bei mir sofort ein rotes Licht
angegangen. Ich nehme an, Du willst Speicherplatz für genau 64000 Variablen
reservieren. Beantworte mal ganz schnell
die Frage, wieviele Zaunpfähle man für einen freistehenden Zaun von 6 Metern Länge braucht, wenn die Pfähle in einem Abstand von einem Meter stehen sollen? Richtig: Man braucht 7 Pfähle, nicht 6!!! Und wieviele Elemente hat ein Array [0…6]? …genau!

Es gibt zwei Möglichkeiten, wie Du Dein
Array mit 64000 Elementen „sauber“ deklarieren kannst.

Entweder so:

TYPE map = ARRAY [1…64000] OF …

oder so:

TYPE map = ARRAY [0…63999] OF …

Gute Programmierer bevorzugen übrigens
die letztere Variante (da die kleinste Zahl einer vorzeichenlosen Integer ja auch die Null ist und nicht die Eins). Wegen
der Analogie zu den Zaunpfählen nennt man diese Art von Vertuern übrigens auch „post fence errors“.

Martin

Hi laurent,

hier ist eine Version, die über ein paar weitere Vorteile verfügt:
Das Hauptprogramm ist als Prozedur main gecastet, was den Vorteil hat, daß man Programme nachträglich ohne großen Aufwand auf dynamische Datenstrukturen umstellen kann. In Heapmerk wird die aktuelle Position des Heappointers abgelegt, so daß der gesamte allozierte Speicherbereich auf einmal freigegeben werden kann. Zusätzlich kannst Du innerhalb von main auf mehrdimensionale Felder in gewohnter Weise, also z.B. mit a[3,1] zugreifen.

Gruß
Ted

program test;
const maxdim=80;
type real=extended;
dimtype=1…maxdim;
vector=array[dimtype] of real;
matrix=array[dimtype] of vector;
var a,b,ev:^matrix;
heapmerk:stuck_out_tongue:ointer;

procedure main(var a,b,ev:matrix);
var ew:vector;
akd:dimtype;

{Hier Programmcode einfügen}

end;

begin
mark(heapmerk);
new(a);
new(b);
new(ev);
main(a^,b^,ev^);
release(heapmerk)
end.

Hi

danke es geht jetzt VIEL BESSER.

gibt es einen unterschied zwichen new§
und getmem § ?

getmem habe ich in der online-hilfe eines
pascals gefunden, new nicht. new geht trotzdem …?

danke

laurent

Hi

danke es geht jetzt VIEL BESSER.

Ja, nicht war? :smile:

gibt es einen unterschied zwichen new§
und getmem § ?
getmem habe ich in der online-hilfe eines
pascals gefunden, new nicht. new geht
trotzdem …?

Du hast mich jetzt erst ziemlich verunsichert. War new nicht bei C und nicht bei Pascal…? Doch, New geht auch. Ist sogar besser als GetMem.

Ich weiß nicht genau, ob es technische Unterschiede zwischen den beiden gibt. New legt einen Speicherbereich für einen Datentyp an und dimensioniert diesen schon passend. Du mußt also nicht mehr explizit angeben, daß ein Byte ein Byte groß ist, ein Word zwei Bytes, usw.
Mit GetMem kannst Du Speicherbereiche (fast) beliebiger Größe anlegen. Du kannst Dir auch einen Zeiger auf ein Byte nehmen und ihn auf einen Speicherbereich zeigen lassen, der 100 Bytes groß ist, einfach in dem Du GetMem(pByte,100) benutzt.

Wie gesagt, es kann sein daß es noch weitere Unterschiede gibt, z.B. wo auf dem Heap die Daten gespeichert werden. Hier kenne ich mich nicht mehr so aus, und außerdem kann das vom Compiler zu Compiler unterschiedlich sein.

–Mathias Ricken