次の例では、無制限のポリモーフィック ポインターを定義し、コンストラクトFortran 2003
に続く変数の型に基づいてアクションを実行する機能を使用しています。select type
サブルーチンhandleP
は、その型に応じて引数の値を出力します。
program example
implicit none
type name
character(22) :: n
end type
character(len=7) :: mystring
mystring = 'Initial'
call handleP(mystring)
call handleP('Initial')
call handleP(name('Initial'))
contains
subroutine handleP(p)
class(*), intent(in) :: p
select type(p)
type is (character(len=*))
write(*,*) len(p), ': ', p
class is (name)
write(*,*) len(p%n), ': ', p%n
class default
write(*,*) 'Unknown type'
end select
end subroutine
end program example
バージョン 4.8でコンパイルすると、gfortran
次の出力が得られます。
7 : Initial
0 :
22 : Initial
したがって、call handleP(mystring)
すべてが期待どおりに機能しますがcall handleP('Initial')
、印刷は失敗します。type(name)
引数を指定して呼び出すこともできます。
動作にバグがありcall handleP('Initial')
ますか、gfortran
それとも何か間違っていますか? それがバグである場合、それを防ぐために何ができますか?