プログラム単位は 1 行以上の文字列で、ステートメント、注釈、および INCLUDE ディレクティブで構成されています。特に以下のものを指します。
実行可能プログラムは、1 つのメインプログラム、任意の数の外部サブプログラム、モジュール、およびブロック・データのプログラム単位からなるプログラム単位の集合体です。
メインプログラムまたはサブプログラムから、あるサブプログラムを呼び出して特定の処理を行わせることができます。プロシージャーを呼び出すと、参照されたサブプログラムが実行されます。
外部サブプログラムまたはモジュール・サブプログラムには、複数の ENTRY ステートメントが入っています。サブプログラムは、 ENTRY ステートメントごとに 1 つのプロシージャーを定義するのはもとより SUBROUTINE または FUNCTION ステートメント用に 1 つのプロシージャーを定義します。
外部プロシージャーは、外部サブプログラムまたは Fortran 以外のプログラム言語で作成されたプログラム単位のいずれかで定義されます。
メインプログラム、外部プロシージャー、ブロック・データのプログラム単位、およびモジュールの名前は、グローバル・エンティティーです。内部プロシージャーおよびモジュール・プロシージャーの名前は、ローカル・エンティティーです。
外部サブプログラム、モジュール・サブプログラム、およびメインプログラムには、関数としてであれサブルーチンとしてであれ、 CONTAINS ステートメント以降に内部サブプログラムを組み込むことができます。
内部プロシージャーは、内部サブプログラムで定義します。内部サブプログラムは他の内部サブプログラムには組み込めません。モジュール・プロシージャーは、モジュール・サブプログラムまたはモジュール・サブプログラム内のエントリーで定義します。
内部プロシージャーおよびモジュール・プロシージャーは、次の点を除いて外部プロシージャーと同じです。
マイグレーションのためのヒント:
外部プロシージャーを内部サブプログラムに変えるか、またはモジュールの中に入れます。明示的インターフェースは、タイプの検査を行います。
FORTRAN 77 ソース
PROGRAM MAIN INTEGER A A=58 CALL SUB(A) C A MUST BE PASSED END SUBROUTINE SUB(A) INTEGER A,B,C ! A must be redeclared C=A+B END SUBROUTINE
Fortran 90 または Fortran 95 ソース
PROGRAM MAIN INTEGER :: A=58 CALL SUB CONTAINS SUBROUTINE SUB INTEGER B,C C=A+B ! A is accessible by host association END SUBROUTINE END
プロシージャーのインターフェースは、プロシージャー参照の形式を決定します。インターフェースは次の部分からなります。
プロシージャーの特性には次のようなものがあります。
仮のデータ・オブジェクトの特性には、そのタイプ、型付きパラメーター (ある場合)、形状、意図、オプションであるかどうか、割り振り可能かどうか、ポインターであるかどうか、およびターゲットであるかどうかなどがあります。タイプ・パラメーターまたは配列境界の決定に関して他のオブジェクトにどの程度左右されるかも特性の 1 つです。形状、サイズ、および文字長が想定される場合、それも特性に含まれます。
仮プロシージャーの特性には、インターフェースの明示性、プロシージャーの特性 (インターフェースが明示的な場合)、およびオプションかどうかなどがあります。
有効範囲単位内でプロシージャーにアクセス可能であれば、プロシージャーはその有効範囲単位内で明示的または暗黙のどちらかのインターフェースをとります。この場合の規則は次のとおりです。
エンティティー | インターフェース |
---|---|
仮プロシージャー |
インターフェース・ブロックがあるか、または インターフェース・ブロックにアクセス可能な場 合、有効範囲単位内で明示的 その他のすべての場合は暗黙 |
外部サブプログラム |
インターフェース・ブロックがあるか、または インターフェース・ブロックにアクセス可能な場 合、有効範囲単位内で明示的 その他のすべての場合は暗黙 |
結果文節付きの再帰的プロシージャー |
サブプログラムの当該有効範囲単位内で明示的 |
モジュール・プロシージャー | 常に明示的 |
内部プロシージャー | 常に明示的 |
総称プロシージャー | 常に明示的 |
組み込みプロシージャー | 常に明示的 |
ステートメント関数 | 常に暗黙 |
内部サブプログラムはインターフェース・ブロックには入れられません。
範囲単位指定内のプロシージャーは、アクセス可能な複数のインターフェースを持つことはできません。
ステートメント関数のインターフェースをインターフェース・ブロック内に指定することはできません。
次の場合、プロシージャーは明示的インターフェースが必要となります。
インターフェースが明確でない場合、つまりサブプログラムに明示インターフェースがない場合、プロシージャーは暗黙のインターフェースをとります。