外部ルーチン・外部関数 - external routines, external functions(Fortran 第7回)

←第6回 ファイル操作
→第8回 内部ルーチン・内部関数

はじめに

第7回は、外部ルーチン・外部関数です。
まったく怖がる必要はありません、ただ関数化してmain programの外に記述するだけの話です。

外部ルーチンとは

main programの外に記述して、main programや他のサブルーチンから呼び出すサブルーチンのことです。
なお、サブルーチンとはある特定のタスクを実行するコードのまとまりのことを指します。

外部関数とは

上との比較で説明すると、外部ルーチンは変数を修正したり、表示を行うもの(手続き的な処理)、外部関数は何らか計算をして値を返すものとしてしばしば用いられます。(サブルーチンと関数の違いに由来しています)

解説

外部ルーチンと外部関数を具体例を用いて解説します。

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

! subroutine_module.f90
subroutine greet(name)
    character(len=*), intent(in) :: name
    print *, 'Hello, ', trim(name), '!'
end subroutine greet

! main_program.f90
program main_program
    implicit none
    character(len=20) :: name

    ! Call the external subroutine
    name = 'John Doe'
    call greet(name)
end program main_program

上の例に関して補足します。
外部ルーチン内での引数の宣言は、
(引数の型), intent(_) :: name で行います。
intent(_)には種類があり、
intent(in): 引数は読み取り専用だよ、書き換えないよ
intent(out): 引数は書き込み専用だよ、書き換えるよ
intent(inout): 引数は読み書きできるよ、サブルーチン内で書き換えたりするけど、実行が終わったら元に戻すよ
という意味があります。

具体例2(外部関数)

! Define the external function
double precision function square(x)
    double precision, intent(in) :: x
    square = x * x
end function square

! Main program that calls the external function
program main
    implicit none
    double precision :: num, squared

    num = 5.0d0
    squared = square(num)
    print *, 'The square of ', num, ' is ', squared
end program main

まとめ

今回は外部ルーチン、外部関数について解説しました。サブルーチンは日本語でしばしば副ルーチンと呼ばれるということを最後に補足しておきます。
第8回は内部ルーチン・内部関数です。

注意

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

←第6回 ファイル操作
→第8回 内部ルーチン・内部関数