Fortranでオブジェクト指向(10)
本日のポイント interfaceの活用1 可変長文字列引数
FortranまたはFORTRANいずれにしても可変長文字列character(*)を
引数にした場合にメモリリークするコードを出力するケースがあります。
この問題の原因はわかりませんが、interfaceを明示的に定義すると
まれに起きる問題も回避できるようです。
interfaceの書式
最も基本的な考え方はサブルーチンまたは関数の引数定義について
呼び出し側で明示的に定義します。
引数以外の変数定義や処理は記述しません。interfaceですからね。
因みにサンプルコードでinterfaceの定義をコメントにするとコンパイルできません。
これはcharacter(*)ではなくcharacter(:), allocatableで定義しているために
明示的なinterfaceの定義を要求されるためです。
サンプルコード
program main
implicit none
!character(20) chr
character(:), allocatable :: chr
!character(*)で引数を受け取る場合はinterface~end interfaceの5行をコメント
interface
subroutine disp(chr)
character(:), allocatable, INTENT(IN) :: chr
end subroutine disp
end interface
chr = "I love Kagiken!"
call disp(chr)
read(5,*)
stop
end program main
subroutine disp(chr)
implicit none
!character(*) chr
character(:), allocatable, INTENT(IN) :: chr
write(6,*) trim(adjustl(chr))
return
end subroutine disp
今日はこれまでにします。