Fortran

Fortranの関数・サブルーチン・モジュール

計算を手続きへ分け、再利用できるコードへ整理します。

Fortran入門の講座一覧

01

functionで値を返す

関数は入力から一つの結果を計算する処理に向いています。関数の戻り値の型を宣言し、関数名へ結果を代入します。

絶対値を返す関数FORTRAN
program function_demo
    implicit none
    print *, absolute(-3.5)
contains
    real function absolute(value)
        real, intent(in) :: value
        absolute = abs(value)
    end function absolute
end program function_demo
実行結果OUTPUT
   3.50000000

contains以降はプログラム内部の手続きを置く場所です。小さな例では便利ですが、複数プログラムで共有する処理はモジュールへ移します。

02

subroutineで複数の値を受け取る

サブルーチンは、引数として渡した変数へ結果を書き戻す処理に向いています。呼び出しはcallを使います。

面積と周囲長を求めるFORTRAN
program rectangle
    implicit none
    real :: area, perimeter
    call calculate(4.0, 3.0, area, perimeter)
    print *, area, perimeter
contains
    subroutine calculate(width, height, area, perimeter)
        real, intent(in) :: width, height
        real, intent(out) :: area, perimeter
        area = width * height
        perimeter = 2.0 * (width + height)
    end subroutine calculate
end program rectangle
実行結果OUTPUT
   12.0000000       14.0000000
03

intentで引数の役割を明示する

intent(in)は読み取り専用、intent(out)は出力、intent(inout)は入力と出力の両方を表します。宣言しておくと、手続き内の意図しない変更をコンパイラーが検出しやすくなります。

使い分け
  • 計算の材料はintent(in)
  • 計算結果として設定する変数はintent(out)
  • 元の値を更新する場合だけintent(inout)

引数を増やしすぎる場合は、派生型やモジュールでデータをまとめる方法を検討します。

04

練習

3辺を受け取り、三角形の面積を返す関数を作ってください。底辺と高さを使う簡単な形から始め、余裕があればヘロンの公式にも挑戦しましょう。