モジュール プロシージャと外部プロシージャを組み合わせた次のコード:
module module_dummy
implicit none
contains
subroutine foo(a)
real, intent(inout) :: a(:)
call bar(a)
end subroutine foo
end module module_dummy
program main
use module_dummy
implicit none
integer, parameter :: nelems = 100000000
real, allocatable :: a(:)
allocate( a(nelems) )
a = 0.0
call foo(a)
print *, a(1:10)
deallocate(a)
end program main
subroutine bar(a)
implicit none
real, intent(inout) :: a(:)
a = 1.0
end subroutine bar
次のいずれかで失敗するようです:
- とともに
segmentation fault
0.000
のブロックの代わりに のブロックを印刷する1.000
これまでに試したどのプラットフォームでも。この問題は の暗黙的なインターフェイス宣言に関連してbar
おり、実際には、次のような方法で明示的なインターフェイスを追加することで問題を解決できます。
module module_dummy
implicit none
contains
subroutine foo(a)
interface
subroutine bar(x)
real, intent(inout) :: x(:)
end subroutine bar
end interface
real, intent(inout) :: a(:)
call bar(a)
end subroutine foo
end module module_dummy
bar
またはモジュール内で使用するように宣言しますmodule_dummy
。
とにかく、そもそもエラーが何であるかが本当にわかりません。Fortran 90 標準(12.3.2.4 節) で見つけたものは、次のように述べています。
プロシージャーの引用仕様が暗黙的であるスコープ単位から参照されるプロシージャーの仮引数の型、型パラメーター、および形状は、実引数が仮引数の特性と一致するものでなければなりません。
この場合、a
常に次のように宣言されているように、ルールは尊重されているようです。
real, intent(inout) :: a(:)
では、以前のコードを間違った標準の解釈で欠落しているものは何ですか?