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.50000000contains以降はプログラム内部の手続きを置く場所です。小さな例では便利ですが、複数プログラムで共有する処理はモジュールへ移します。
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.0000000intentで引数の役割を明示する
intent(in)は読み取り専用、intent(out)は出力、intent(inout)は入力と出力の両方を表します。宣言しておくと、手続き内の意図しない変更をコンパイラーが検出しやすくなります。
使い分け
- 計算の材料は
intent(in) - 計算結果として設定する変数は
intent(out) - 元の値を更新する場合だけ
intent(inout)
引数を増やしすぎる場合は、派生型やモジュールでデータをまとめる方法を検討します。
練習
3辺を受け取り、三角形の面積を返す関数を作ってください。底辺と高さを使う簡単な形から始め、余裕があればヘロンの公式にも挑戦しましょう。