1. HOME
  2. ブログ
  3. Fortranでオブジェクト指向
  4. Fortranでオブジェクト指向(10)

ブログ

Fortranでオブジェクト指向

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

今日はこれまでにします。

関連記事