私は次のプログラムに少し戸惑っています
module test
implicit none
type TestType
integer :: i
end type
contains
subroutine foo(test)
type (TestType), intent(out) :: test
test%i = 5
end subroutine
subroutine bar(test)
type (TestType), intent(out) :: test
test%i = 6
end subroutine
end module
program hello
use test
type(TestType) :: t
call foo(t)
print *, t%i
call bar(t)
print *, t%i
end program hello
およびその派生物。それらについては後で詳しく説明します。ご存知のように、Fortranはルーチン引数を参照渡しとして転送します。つまり、test
両方のダミー引数でfoo
出現するエンティティbar
は、のスタックで付与された同じメモリスペースprogram hello
です。ここまでは順調ですね。
でポインタとして定義しprogram hello
、type(TestType) :: t
それを割り当てたとします。
program hello
use test
type(TestType), pointer :: t
allocate(t)
call foo(t)
print *, t%i
call bar(t)
print *, t%i
deallocate(t)
end program hello
コードは以前と同じように機能しますが、唯一の違いは、オブジェクトがスタックではなくヒープに割り当てられていることです。
ここで、スタックに割り当てられたプログラムに戻り、その代わりにサブルーチンバーが次のように定義されていると仮定します。
subroutine bar(test)
type (TestType), pointer :: test
test%i = 6
end subroutine
プログラムを機能させるにはヒープ割り当てバージョンを使用する必要があるため、プログラムはコンパイルされなくなります。より正確に言うと、ルーチンがダミー引数としてポインターを受け入れるように定義されている場合は、ルーチンへのポインターを渡す必要があります。一方、ダミー引数にpointer
キーワードが含まれていない場合、ルーチンはポインターと非ポインターの両方を受け入れます。
これは私に不思議に思います...ダミー引数をポインタとして宣言することのポイントは何ですか?