0

ポイントはポインタで動作させることです。また、C++でsimilar problemが見つかりました。それはパスカルとはうまく動作しません。何かを逃した。パスカルで3Dダイナミックアレイを削除中にエラーが発生する

1)私は私のポインタの型と変数を作る:

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

2)これは私がメモリを割り当てる方法である(X、Y、Z)が寸法である:

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)及び

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); 

をしかし、私は216(メモリアクセス)または204(無効なポインタ操作)実行時エラーを取得しています:これは私が)(それを処分しようとする方法です。 thisのように。完全code(FreePascal IDE)

何かお手伝いします。

+1

パスカルをよく知られているものに使用しないようにしてください。動的配列をパスカルで扱う方法の例については、[多次元動的配列](http://wiki.freepascal.org/Example:_Multidimensional_dynamic_array)を参照してください。 –

+0

パスカルはCスタイルのポインタ+整数加算を行いますか? – user3344003

答えて

2

最後のdisposeはgetmemに反映されますが、残りの2つはgetmemに反映されません。修正してください:

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はgetmemの論理的なコンパニオンです。disposeは新しいものです。

+0

私は今、私のエラーがあります。ご協力いただきありがとうございます。 – Esixt

関連する問題