株式会社 科学技術研究所
ホーム > かぎけんブログ > 藤田明希 > Fortranでオブジェクト指向 > Fortranでオブジェクト指向(1)
Fortranでオブジェクト指向(1)
投稿日:2017/02/15
カテゴリ:Fortranでオブジェクト指向

本日取り上げるポイント
Module, TYPE, TYPEの入れ子
サブルーチン・関数へのポインタ

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
    ! 処理
    return
    end subroutine print_facet
END MODULE facetMod

 

Moduleの宣言

MODULE [module name]
! 定義
END MODULE [module name]

で行います。
Fortran90以降で他のファイルに記述したプログラムから参照可能な記憶領域や
サブルーチン、関数を定義する場合にはModuleを使用します。
Moduleを使用せずにサブルーチンや関数を定義することもできますが、
その場合はプログラム全体から無条件に参照できるためカプセル化という点で
問題があります。
新しいFortranではCOMMON文による記憶領域の共有は(暗黙の?)非推奨になって
いますのでModuleの使用は必須となります。
Moduleで定義した記憶領域やサブルーチン、関数は
use [module name]
を指定したプログラムからのみ参照可能となり、カプセル化を実現できます。

 

TYPEの宣言

TYPE [type name]
! 定義
END TYPE [type name]

で行います。
オブジェクト指向プログラムの所謂クラスはFortranでは構造体とよばれ
TYPEとして宣言されます。上のプログラムでは倍精度実数型の値x, y, z
をもつPOINT構造体が宣言されています。

 

TYPEの入れ子

別のTYPEで定義した構造体を含む構造体を使用することが可能です。
上のプログラム例では3要素のPOINT構造体を配列としてもつFACET構造体
が定義されています。

 

サブルーチン・関数へのポインタ

TYPEにサブルーチン・関数を含める場合にはCONTAINS文を用いて
以降にサブルーチンや関数を記述します。
これを用いてメソッドと同等の処理機能を実装できます。
上の例では
  procedure :: print => print_facet
を定義して、MODULE facetModに定義されたサブルーチンprint_facetを
printという名前で参照できるように定義しています。

以上で構造体の定義に関するごく基礎的なポイントの解説とします。
次回は定義した構造体の参照について説明します。