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
などのように参照できます。
今日は以上です。