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

ブログ

Fortranでオブジェクト指向

Fortranでオブジェクト指向(2)

本日取り上げるポイント CONTAINS, サブルーチン, 構造体の参照

MODULE facetMod
TYPE POINT
    double precision x, y, z
END TYPE POINT

TYPE FACET
    TYPE(POINT) pt(3)
CONTAINS
  procedure :: print => print_facet
END TYPE FACET

CONTAINS
    subroutine print_facet(this)
    implicit none
    CLASS(FACET), INTENT(INOUT) :: this
    integer i
    character(10), parameter :: header(3) = (/"1st point","2nd point","3rd point"/)

    do i = 1, 3
      write(6,'((a),3(f6.2,1x))') header(i), this%pt(i)%x, this%pt(i)%y, this%pt(i)%z
    end do
    return
    end subroutine print_facet
END MODULE facetMod

CONTAINS文

TYPEで定義される構造体またはMODULEで定義されるモジュールは
サブルーチンまたは関数をCONTAINS文以下に含めることが出来ます。
上の例ではFACET構造体のCONTAINS文で
procedure :: print => print_facet
が指定されているので%printを指定した時にMODULE facetModで
CONTAINSされているprint_facetが呼び出されることになります。

構造体自身を引数で渡す

サブルーチンprint_facetの引数はFACET構造体型のthisです。
つまり構造体自身のデータが引数になっています。
またINTENT(INOUT)が指定されているのは、このサブルーチン内部での
引数処理で引数の値を取得して、さらに呼び出し側に返すことを
意味しています。
ここはINTENT(IN)でも動作します。(というよりこちらの方が適切)

構造体の参照

構造体で定義されたメンバー(変数、関数、サブルーチン)には
構造体名に「%」を付けて参照します。
例えば引数thisで参照しているFACET構造体のメンバである
POINT構造体型のpt配列を参照するには
this%pt(1)
のように記述します。さらにptのメンバであるx, y, zを参照する場合
this%pt(1)%x
this%pt(1)%y
this%pt(1)%z
のように記述します。
上記のサンプルにはまだ記述していませんがサブルーチンの参照も同様で
CLASS(FACET) afacet
でCLASS定義し
call afacet%print
などのように参照できます。

今日は以上です。
 

関連記事