3

これから説明する内容の背後にあるロジックを理解したいと思います。
「module.f90」がある場合:

module def_dimens
integer :: dimens=4
end module def_dimens

「subr.f90」:

subroutine sub(X)
integer :: X
integer :: S(1:X*5)
S=1
print*,S
end subroutine sub

および「main.f90」:

program test
use def_dimens
call sub(dimens)
end program test

結果をコンパイルgfortran module.f90 subr.f90 main.f90して実行しても問題はありません。

しかし、によって与えられた「main2.f90」では

program test
use def_dimens
integer :: A(1:dimens*5)
A=1
print*,A
end program test

コンパイルgfortran module.f90 main2.f90するとエラーが発生するため、割り当て可能な配列を使用する必要があります。

program test
use def_dimens
integer,allocatable :: A(:)

allocate(A(1:dimens*5))
A=1
print*,A
end program test

または、モジュールで「dimens」をパラメーターとして指定する必要があります (ただし、これよりも複雑な場合、使用する前に別のサブルーチンを呼び出して値を固定する変数が必要になるため、これは役に立ちません)。

だから私の質問は:なぜそのような違いがあるのですか?変数を使用してサイズを修正することにより、メイン プログラムで配列を宣言する必要がある場合に gfortran が文句を言うのはなぜですか?

4

2 に答える 2

2

コンパイラがvariableと見なす変数を静的に定義した配列を持つことはできません。エラー コード (印刷した場合) は非常に明確です。

エラー: a(1) のモジュールまたはメイン プログラム配列は一定の形状でなければなりません

コンパイラは、 が定数であると想定dimensされていることを知りません。次のように宣言することで、これを修正できます。dimensparameter

module def_dimens
   integer, parameter :: dimens=4
end module
于 2013-08-22T15:10:53.873 に答える
2

カイルの答えに追加するには、仮引数ではないか、save属性を持たないサブルーチンで配列を宣言すると、automatic array . サブルーチンの実行が開始されるたびに自動的に割り当てられます。形状の式の変数の値に従って割り当てられます。配列内の値は呼び出し間で保持されません。

于 2013-08-22T15:23:13.513 に答える