2012-04-04 52 views
-5

私のFORTRANコードの一部の割り当てを解除して割り当てることに問題があります。特に、私の問題はWeb上のエラーメッセージの検索からのメモリ割り当てと関係していると思います。しかし、私のプログラムでポインタを使用していません。FORTRANでの割り当て解除とメモリ割り当ての問題

私のfループ(下記参照)の反復#2を完了すると、プログラムはクラッシュします。それはちょうどフリーズアップします。私は、これがバグのポイントであると確信しています。この時点までにプログラムが実行されます。

私はサブルーチンを表示していませんが、他のシミュレーションの組み合わせで動作するため、問題ではないと合理的に確信しています。私は割り当て解除を使用しており、プログラム内の他の場所に割り当てています(正常に)ので、ここでは動作していないことに驚いています。

私は読書の容易さのためにプログラムの一部を示しています。特に、私が書いたサブルーチンへの呼び出しを削除しました。私はあなたが問題を理解するのに役立つプログラマーにとって十分な情報を提供してくれることを願っています。そうでない場合は、あなたが望むその他の情報を指定してください。私は喜んで遵守します。私はさまざまなコンパイラオプションを使用してプログラムをコンパイルし、いくつかのバグを修正し、警告を削除しました。しかし、この時点では、コンパイラオプションは私にそれ以上の情報を与えません。

allocate(poffvect(1:6)) 
allocate(phi1out(1:1)) 
allocate(phi2out(1:1)) 
allocate(phi1outs1(1:1)) 
allocate(phi2outs1(1:1)) 

    dummy allocation 
    allocate(phi1outind(1:1)) 
    allocate(phi2outind(1:1)) 
    allocate(phi1outinds1(1:1)) 
    allocate(phi2outinds1(1:1)) 

    do e = 1, 6 
    print *,"e", e 
    do f = 1, 3 

     print *,"f", f, iteratst1(f), trim(filenumcharimp) 

     deallocate(phi1outinds1, STAT = AllocateStatus) 
    if (AllocateStatus /= 0) stop "Error during deallocation of phi1outinds1" 
    print *, "Allocatestatus of phi1outinds1 is", AllocateStatus 
    deallocate(phi2outinds1, STAT = AllocateStatus) 
    print *, "DeAllocatestatus of phi1outinds2 is", AllocateStatus 

    if (AllocateStatus /= 0) stop "Error during deallocation of phi2outinds1" 
    print *, "we deallocate f loop ok", iteratst1(f) 

     allocate(phi1outinds1(1:iteratst1(f)), STAT = AllocateStatus) 
    if (AllocateStatus /= 0) stop "Error during allocation of phi1outinds1" 
    allocate(phi2outinds1(1:iteratst1(f)), STAT = AllocateStatus) 
    if (AllocateStatus /= 0) stop "Error during deallocation of phi1outinds1" 

end do 
end do 

コンパイラオプション

ifort -free -check -traceback -o adatptmultistage1new.out adatptmultistage1new.f90 

出力

 e   1 
     f   1  5000 43 
    DeAllocatestatus of phi1outinds1 is   0 
    DeAllocatestatus of phi1outinds2 is   0 
    we deallocate f loop ok  5000 
    f loop done   1 
    f   2  10000 43 
Allocatestatus of phi1outinds1 is   0 
DeAllocatestatus of phi1outinds2 is   0 
we deallocate f loop ok  10000 
    f loop done   2 
    f   3  15000 43 
    Allocatestatus of phi1outinds1 is   0 

エラーメッセージ

*** glibc detected *** ./adatptmultistage1new.out: munmap_chunk(): invalid pointer: 0x0000000000d3ddd0 *** 
    ======= Backtrace: ========= 
    /lib/libc.so.6(+0x77806)[0x7f5863b7b806] 
    . /adatptmultistage1new.out[0x43247c] 
    . /adatptmultistage1new.out[0x404368] 
    ./adatptmultistage1new.out[0x4031ec] 
    /lib/libc.so.6(__libc_start_main+0xfd)[0x7f5863b22c4d] 
    . /adatptmultistage1new.out[0x4030e9] 
    ======= Memory map: ======== 
00400000-004d4000 r-xp 00000000 08:03 9642201 
/home/jgold/smwcv/error_infect/test/surfaces/multistage/adaptonly/adatptmultistage1new.out 
006d4000-006dc000 rw-p 000d4000 08:03 9642201 

[エラーメッセージの残りの部分は簡潔のため図示していない]

7fffb004d000-7fffb00bc000 rw-p 00000000 00:00 0       [stack] 
    7fffb01d7000-7fffb01d8000 r-xp 00000000 00:00 0       [vdso] 
    ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0     [vsyscall] 
    Aborted 
+0

ソースコードの書式を修正できますか?インデントも役立ちます。 – Chris

+3

http://sscce.org/ – eriktous

+1

割り当てまたは解除のステートメントによって返されるステータスコードはチェックしません。そうすることで、有用な診断情報が得られるかもしれません。 –

答えて

5

これは、私たちが把握しようとする多くのコードです。できるだけ多くのコンパイラデバッグオプションでコンパイルしましたか?特に、配列の境界チェックを使用していますか?どのコンパイラを使用していますか?私は "使用"ステートメントが表示されません...あなたのサブルーチンをモジュールに入れ、コンパイラが実際の引数と仮引数の間の引数の一貫性をチェックできるように、そのモジュールを "使用する"方が良いでしょう。

EDIT: "double free or corruption"は、メモリが壊れていることを示します。あなたはポインタを持っていないので、メモリを壊す可能性のある3つの方法があります:

  1. 割り当てられていない割り当て可能な変数を使用してください。 allocateステートメントが失敗した場合、プログラムはその時点でおそらくエラーをスローします。割り当てを忘れた変数を使用している可能性があります。
  2. プロシージャの呼び出しの引数と実際の引数と仮引数の間で期待されるものとの間に不一致があります。モジュールを使用すると、コンパイラはこれをよりよくチェックできます。
  3. 不正な添字値を使用して配列のサイズ外に書く - これは、次の配列を記述する内部構造などの "ランダム"メモリを上書きします。実行時添字または配列境界チェックをオンにすると、これがテストされます。 ifort使用:-check boundsまたは-check all。非常にチェックしてみてください:-O2 -stand f03 -check all -traceback -warn all -fstack-protector -assume protect_parens -implicitnone
+1

こんにちは、私はあなたの提案を試みます。コードの量に関する私の謝罪。私はコードを使用しており、それを修正して複雑さを増しています。私はifortを使用しています。配列の境界チェックではどういう意味ですか? –

+0

私はそれをしてくれましたが、プログラム内で使われなくなった変数を教えてくれました。私はそれが提供したメッセージからはっきりと何かを見ることができません。私はあなたがそれを見ることができ、うまくいけば私ができるよりもそれを解釈できるように、これらのオプションを適用することからメッセージを投稿しています。私は本当にあなたの助けに感謝します。ありがとうございました –

+0

リンクに問題があるようです。以前のエラーメッセージまたは警告メッセージはありますか? –

関連する問題