インターフェース・ブロック は、外部プロシージャーおよび仮プロシージャー用の明示的インターフェースを指定する 1 つの手段です。また、このインターフェース・ブロックを使用して、総称識別子を定義することもできます。インターフェース・ブロック内のインターフェース本体 とは、既存の外部プロシージャーまたは仮プロシージャー用の特定の明示的インターフェースを指定するものです。
>>-INTERFACE_statement----------------------------------------->< .--------------------------------. V | >>---+----------------------------+-+-------------------------->< +-FUNCTION_interface_body----+ +-SUBROUTINE_interface_body--+ '-MODULE_PROCEDURE_statement-' >>-END_INTERFACE_statement------------------------------------->< |
FUNCTION_interface_body
>>-FUNCTION_statement------------------------------------------>< >>-+--------------------+-------------------------------------->< '-specification_part-' >>-end_function_statement-------------------------------------->< |
SUBROUTINE_interface_body
>>-SUBROUTINE_statement---------------------------------------->< >>-+--------------------+-------------------------------------->< '-specification_part-' >>-end_subroutine_statement------------------------------------>< |
インターフェース本体においては、プロシージャーの特性すべてを指定してください。 インターフェースの概念を参照してください。その特性は、サブプログラムの定義で指定した内容と一致している必要があります。ただし、以下の場合を除きます。
インターフェース本体の specification_part は、プロシージャーの特性を決定しないデータ・オブジェクトの属性指定や値の定義を行うステートメントを含めることが可能です。そのような仕様ステートメントは、インターフェースに影響を及ぼしません。インターフェース・ブロックは、その特性がモジュール・サブプログラム定義で定義されるモジュール・プロシージャーの特性を指定しません。
インターフェース本体には、ENTRY ステートメント、 DATA ステートメント、FORMAT ステートメント、ステートメント関数ステートメント、または実行可能ステートメントを入れることはできません。エントリー・インターフェースを指定することにより、エントリー名をインターフェース本体内のプロシージャー名として使用することができます。
インターフェース本体は、ホスト関連付けを介して名前付きエンティティーを使用することはありません。インターフェース本体はデフォルトの暗黙規則付きのホストと同様に扱われます。暗黙規則の説明については、タイプの決め方を参照してください。
インターフェース・ブロックは、総称または非総称のいずれかです。総称インターフェース・ブロックは、INTERFACE ステートメント内で総称仕様を指定しなければなりませんが、非総称インターフェース・ブロックではそのような総称仕様を指定する必要はありません。詳細については、INTERFACEを参照してください。
非総称インターフェース・ブロック内部のインターフェース本体には、サブルーチンおよび関数双方のインターフェースを入れることができます。
総称名は、インターフェース・ブロック内のすべてのプロシージャーを参照するために、単一の名前を指定します。総称名でのプロシージャー参照が発生するたびに、最大 1 つの特定のプロシージャーが呼び出されます。
MODULE PROCEDURE ステートメントが使用できるのは、インターフェース・ブロックが総称仕様が指定されていて、かつ各プロシージャー名がモジュール・プロシージャーとしてアクセス可能な有効範囲単位内に入れられている場合だけです。
MODULE PROCEDURE ステートメントで使用されるプロシージャー名は、アクセス可能なインターフェース・ブロック中の MODULE PROCEDURE ステートメントでこれまでに同一の総称識別子を指定して指定された名前にすることはできません。
+----------------------------------IBM 拡張----------------------------------+
Fortran 以外のサブプログラムに対するインターフェースの場合、FUNCTION または SUBROUTINE ステートメント内の仮引き数リストにより引き渡し方法を明示的に指定できます。詳細については、仮引き数を参照してください。
+--------------------------------IBM 拡張の終り-------------------------------+
MODULE M CONTAINS SUBROUTINE S1(IARG) IARG = 1 END SUBROUTINE S1 SUBROUTINE S2(RARG) RARG = 1.1 END SUBROUTINE S2 SUBROUTINE S3(LARG) LOGICAL LARG LARG = .TRUE. END SUBROUTINE S3 END
USE M INTERFACE SS SUBROUTINE SS1(IARG,JARG) END SUBROUTINE MODULE PROCEDURE S1,S2,S3 END INTERFACE CALL SS(II) ! Calls subroutine S1 from M CALL SS(I,J) ! Calls subroutine SS1 END
SUBROUTINE SS1(IARG,JARG) IARG = 2 JARG = 3 END SUBROUTINE
特定のインターフェースを介してプロシージャーを必ず参照できます。プロシージャーに総称インターフェースが存在する場合は、総称インターフェースを介してプロシージャーを参照することができます。
インターフェース本体内では、仮引き数を仮プロシージャーとする場合、仮引き数を EXTERNAL 属性に指定するか、または仮引き数のインターフェースを確保する必要があります。