内部ルーチン・内部関数 - internal routines, internal functions(Fortran 第8回)

←第7回 外部ルーチン・外部関数
→第9回 モジュール

はじめに

第8回は内部ルーチン・内部関数です。
第7回でやった外部ルーチン・外部関数と似ている部分あるので、サクッと解説していきます。

内部ルーチンとは

内部ルーチンとは、main programやほかのサブルーチン内で定義されるサブルーチンのこと。呼び出しは内部ルーチンが定義されたプログラムからのみ可能です。

内部関数とは

内部関数とは、main programやほかのサブルーチン内で定義される関数のこと、呼び出しは内部ルーチンと同様。
内部ルーチンは手続き的な処理を行うのに対し、内部関数は入力された値に対して何らかの計算をして出力するという特徴があります。(サブルーチンと関数の違いに由来しています)

解説

内部ルーチン、内部関数を記述する前にcontainsと記述します

具体例1(内部ルーチン)

program main_program
    implicit none
    real :: num1, num2, sum

    num1 =  3.0
    num2 =  4.0

    ! Call the internal subroutine to add two numbers
    call add_numbers(num1, num2, sum)
    print *, 'The sum of ', num1, ' and ', num2, ' is ', sum

contains
    ! Internal subroutine to add two numbers
    subroutine add_numbers(x, y, s)
        real, intent(in) :: x, y
        real, intent(out) :: s
        s = x + y
    end subroutine add_numbers
end program main_program

具体例2(内部関数)

program main_program
    implicit none
    real :: a, b, c
    real :: result

    a =  3.0
    b =  4.0

    ! Call the internal function to calculate the area of a triangle
    result = triangle_area(a, b)
    print *, 'The area of the triangle is: ', result

contains
    ! Internal function to calculate the area of a triangle
    function triangle_area(base, height) result(area)
        real, intent(in) :: base, height
        real :: area
        area =  0.5 * base * height
    end function triangle_area
end program main_program

疑問点

「外部ルーチンと内部ルーチンの使い分けの基準は?」

いろいろな基準で考えることができます。
再利用性の観点から、外部ルーチンはどこからでも呼び出せるのに対し、内部ルーチンは定義したサブルーチン内からしか呼び出せないので呼び出し元を限定できます。
コードの構造の観点から、外部ルーチンは分割する傾向、内部ルーチンは階層化する傾向があります。
外部ルーチンは、main programに実装の内容を記述しないので、カプセル化が可能です。
内部ルーチンは、呼び出し元のプログラムの変数や状態を利用する場合に適切でしょう。

まとめ

今回は内部ルーチン・内部関数の解説と、外部ルーチンとの使い分けについて解説しました。個人的には、関数を階層化するとコードが読みにくくなるので、できれば外部関数を使いたいと思いました。
第9回はモジュールです。

注意

このページは大学のFortranの授業の予習で書いています。
直観的な理解をメモしているだけなので、厳密なところでは誤りがあるかもしれません。

←第7回 外部ルーチン・外部関数
→第9回 モジュール