これから説明する内容の背後にあるロジックを理解したいと思います。
「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 が文句を言うのはなぜですか?