導入
数値計算において、Fortranは依然として強力な言語ですが、関数の定義が複雑になるとコードの可読性が低下しがちです。特に、高精度計算のためのKIND定数や、文字列の長さ(LEN)指定が関数の引数や戻り値に絡むと、関数定義行が非常に長くなってしまいます。今回は、RESULT句を用いて戻り値の型を関数定義行の外側で宣言する「プロの記法」をご紹介します。これにより、コードの保守性が劇的に向上します。
基礎知識
Fortranにおいて、関数は通常「type function name(…)」という形式で定義されます。しかし、この方法では戻り値の型や属性(配列の形状やメモリ確保の可否など)をすべて関数名の手前で指定しなければなりません。
一方、RESULT句を使用すると、関数名とは別に「戻り値を受け取る変数名(結果変数)」を明示的に定義できます。この結果変数は関数内でのみ有効な変数として扱われるため、関数本体の中で柔軟に属性を定義できるというメリットがあります。
実装/解決策
具体的な手順としては、関数定義行では戻り値の型をあえて記述せず、関数宣言の末尾に「result(変数名)」を記述します。そして、関数内の先頭部分で、その変数名に対して型やKIND定数、LENパラメータを個別に宣言します。これにより、関数定義行がシンプルに保たれ、戻り値の定義がコードの構造として明確になります。
サンプルプログラム
以下は、倍精度実数(real(dp))を返す関数の実装例です。KIND定数を用いた定義がスッキリと記述されている点にご注目ください。
! 必要な定数の定義
integer, parameter :: dp = selected_real_kind(15, 307)
! 関数定義(RESULT句を使用)
function calculate_area(radius) result(area)
! 引数の型宣言
real(dp), intent(in) :: radius
! 結果変数(area)の型宣言を関数内部で行う
! これにより、関数定義行が短く見やすくなる
real(dp) :: area
! 計算処理
area = 3.141592653589793_dp radius2
end function calculate_area
応用・注意点
この記法の最大の利点は、戻り値が配列である場合や、可変長文字列(character(len=:))を返す場合に発揮されます。例えば、関数内で戻り値の配列サイズを動的に決定して割り当てる際、RESULT句を使えばメモリの割当(allocatable属性)と型定義を関数内で完結でき、非常に読みやすくなります。
注意点として、関数名自体に戻り値を代入する旧来のスタイルと混同しないようにしてください。RESULT句を使った場合、関数名ではなく、指定した「結果変数(上記の例ではarea)」に対して値を代入する必要があります。関数名に値を代入しようとするとコンパイルエラーや予期せぬ動作の原因となるため、この点だけは注意して開発を進めてください。

コメント