1

モジュールで宣言され、サブルーチン内で割り当ておよび初期化された配列の割り当て解除に関する Fortran 90 コードで問題が発生しています。私のプログラム内では、 のようなモジュールで一連の配列を宣言していますreal*8, dimension(:), allocatable :: test。次に、初期化サブルーチンでuse、モジュールを で変数を割り当て、 allocate(test(8))で初期化しtest = 0.d0ます。

この後print*, test、適切な出力を取得できます: 0.E+0 0.E+0 0.E+0 0.E+0 0.E+0 0.E+0 0.E+0 0.E+0. さらに、 を呼び出すと、allocated(test)が返されます.TRUE.。それにもかかわらず、何かがうまくいかない。への呼び出しの直後に、 へallocate()の呼び出しがsizeof(test)返さ0れ、 への呼び出しが次のエラーをdeallocate(test)スローします。

lib-4422 : UNRECOVERABLE library error 
  A DEALLOCATE statement argument points to a portion of the
 original allocation.
  Original size in bytes for the argument is 512
  Current size in bytes for the argument is 0
Segmentation fault

これはすべて、エラーなしでこれらの配列を使用した大きなコード内で発生します。メモリ リークを探しているときに、プログラムの最後でメモリの割り当てを解除しようとしたときだけ、問題に気付きました。上記のことだけを行う単純なプログラムを作成しようとしました (つまり、モジュールで宣言し、サブルーチンで割り当てと初期化を行い、同じサブルーチン内で配列を出力して割り当てを解除します)。ただし、この単純なコードは正しく機能し、エラーなしで実行されます。したがって、より大きなコードのコンテキスト内でこれが誤動作する原因となる可能性があるものについて、私は非常に混乱しています。さらに、より大きなコード内で宣言行をモジュールからサブルーチンに移動すると、すべてが適切に実行されます。

アドバイスをいただければ幸いです。前もって感謝します、

〜BCL

4

1 に答える 1

0

単一のサブルーチンの内部にない配列を扱う pointer 場合、それらを宣言するときに、属性の代わりに常に属性を使用します。実際には、どちらも同じように機能します。例えば:

module Mod1
contains
  subroutine sub1(Array)
    !*** Declaration of Variables
    implicit none
    !*** External Variables - Arguments
    real(kind=8), pointer, intent(inout) :: Array(:)
    !*** Internal Variables
    real(kind=8), allocatable            :: InternalArr(:)
    !*** Memory allocation
    allocate(Array(1:8))
    allocate(InternalArr(9:10))
    !*** End of Subroutine
  end subroutine sub1
end module Mod1

を呼び出すsub1と、配列はコードの任意の場所でその次元を保持します。必要なだけ使用できdeallocateます。allocate

使用する前pointerに、あなたが説明したような問題がいくつか発生し、誰かがpointer代わりに使用することを提案しました。それ以来、私はこの方法で配列を宣言することに非常に慣れてきました (使用し続ける同じサブルーチンまたはモジュールにそれらが残ることを意図している場合allocatable)。

これが役立つことを本当に願っています...これが私の最初の答えです:) 編集:サンプルコードの小さなエラーを修正しました

于 2013-07-05T14:58:14.193 に答える