0

Der Punkt ist, damit es mit Zeigern arbeiten. Außerdem habe ich similar problem mit C++ gefunden. Es funktioniert nicht mit Pascal, nun, ich prob. etwas verpasst.Fehler beim Löschen von dynamischen 3D-Array in Pascal

1) I-Typen und variable für meine Zeiger machen:

type 
    PReal = ^double; 
    PPReal = ^PReal; 
var 
    data : ^PPReal; 

2) Dies ist, wie I-Speicher (x, y, z sind Dimensionen) zuzuteilen:

GetMem(data, sizeof(PPReal)*x); 
for i:=0 to x-1 do begin 
    GetMem((data+i)^, sizeof(PReal)*y); 
    for j:=0 to y-1 do begin 
    GetMem(((data+i)^+j)^, sizeof(real)*z); 
    end; 
end; 

3) und das ist, wie ich versuche, es zu entsorgen():

for i:=0 to x-1 do begin 
    for j:=0 to y-1 do begin 
    Dispose(((data+i)^+j)); 
    end; 
    Dispose((data+i)); 
end; 
Dispose(data); 

Allerdings bin ich 216 (Speicherzugriff) oder 204 (ungültiger Zeiger Betrieb) Laufzeitfehler zu bekommen. Wie this. Voll code (FreePascal IDE)

Jede Hilfe geschätzt.

+1

Warum Pascal nicht für das verwenden, wofür es bekannt ist, geben Sie Sicherheit ein. Unter [Mehrdimensionales dynamisches Array] (http://wiki.freepascal.org/Example:_Multidimensional_dynamic_array) finden Sie Beispiele für die Arbeit mit dynamischen Arrays in Pascal. –

+0

Führt Pascal C-Style-Zeiger + Ganzzahladdition? – user3344003

Antwort

2

Die letzte dispose ist auf seine getmem gespiegelt, aber die anderen beiden nicht. Fix das und es funktioniert:

for i:=0 to x-1 do begin 
    for j:=0 to y-1 do begin 
    writeln(i,' ',j,' *'); 
    Dispose(((data+i)^+j)^); 
    end; 
    writeln(i,' ',j); 
    Dispose((data+i)^); 
end; 
Dispose(data); 

p.s. Freemem ist der logische Begleiter von Getmem, wie Dispos zu Neuem ist.

+0

Ich habe jetzt meinen Fehler. Danke für Ihre Hilfe. – Esixt

Verwandte Themen