プログラム単位、プロシージャー、およびサブプログラム

プログラム単位は 1 行以上で、ステートメント、コメント、および INCLUDE ディレクティブで 編成されています。 特に以下のプログラム単位を指します。

実行可能プログラムは、1 つのメインプログラム、任意数の外部サブプログラム、モジュール、および ブロック・データのプログラム単位からなるプログラム単位の集合です。

サブプログラムは、特定のアクティビティーを実行するためにメインプログラムまたは別のサブプログラムから呼び出すことができます。 プロシージャーを呼び出すと、参照されたサブプログラムが 実行されます。

外部サブプログラムまたはモジュール・サブプログラムには、 複数の ENTRY ステートメントが入っています。 サブプログラムは、 ENTRY ステートメントごとに 1 つのプロシージャーを定義するのは もとより SUBROUTINE または FUNCTION ステートメント 用に 1 つのプロシージャーを定義します。

外部プロシージャーは、外部サブプログラムまたは Fortran 以外のプログラム言語で 作成されたプログラム単位のいずれかで定義されます。

メインプログラム、外部プロシージャー、ブロック・データのプログラム単位、およびモジュールの名前は、 グローバル・エンティティーです。 内部プロシージャーおよびモジュール・プロシージャーの名前は、 ローカル・エンティティーです。

内部プロシージャー

外部サブプログラム、モジュール・サブプログラム、およびメインプログラムには、 関数としてであれサブルーチンとしてであれ、CONTAINS ステートメント以降に内部サブプログラムを組み込むことができます。

内部プロシージャーは、内部サブプログラムで定義します。 内部サブプログラムは他の内部サブプログラムには組み込めません。 モジュール・プロシージャーは、モジュール・サブプログラムまたは モジュール・サブプログラム内の入り口で定義します。

内部プロシージャーおよびモジュール・プロシージャーは、 次の点を除いて外部プロシージャーと同じです。



マイグレーションのためのヒント:

外部プロシージャーを内部サブプログラムに変えるか、または
モジュールの中に入れます。
明示的インターフェースは、型の検査を行います。

FORTRAN 77 ソース

      PROGRAM MAIN
        INTEGER A
        A=58
        CALL SUB(A)     ! C 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. 次の条件でプロシージャーへの参照がある場合
  2. プロシージャーに次のものがある場合
  3. FORTRAN 95 の開始プロシージャーはエレメント型プロシージャーです。 FORTRAN 95 の終了
  4. プロシージャーは、 FORTRAN 2003 の開始 BIND FORTRAN 2003 の終了 属性を持ちます。

暗黙インターフェース

インターフェースが明確でない場合、つまりサブプログラムに 明示インターフェースがない場合、プロシージャーは暗黙のインターフェースを とります。 IBM Copyright 2003