インターフェース・ブロック

インターフェース・ブロック は、外部プロシージャーおよび ダミー・プロシージャー用の明示的インターフェースを指定する 1 つの手段です。 また、このインターフェース・ブロックを使用して、総称識別子を 定義することもできます。 インターフェース・ブロック内のインターフェース本体 とは、 既存の外部プロシージャーまたはダミー・プロシージャー用の 特定の明示的インターフェースを指定するものです。



>>-INTERFACE_statement-----------------------------------------><
 
 
   .--------------------------------.
   V                                |
>>---+----------------------------+-+--------------------------><
     +-FUNCTION_interface_body----+
     +-SUBROUTINE_interface_body--+
     '-MODULE_PROCEDURE_statement-'
 
 
>>-END_INTERFACE_statement-------------------------------------><
 
 

INTERFACE_statement
構文の詳細については、INTERFACEを参照してください。

END_INTERFACE_statement
構文の詳細については、END INTERFACEを参照してください。

MODULE_PROCEDURE_statement
構文の詳細については、MODULE PROCEDUREを参照してください。

FUNCTION_interface_body



>>-FUNCTION_statement------------------------------------------><
 
 
>>-+--------------------+--------------------------------------><
   '-specification_part-'
 
 
>>-end_function_statement--------------------------------------><
 
 

SUBROUTINE_interface_body



>>-SUBROUTINE_statement----------------------------------------><
 
 
>>-+--------------------+--------------------------------------><
   '-specification_part-'
 
 
>>-end_subroutine_statement------------------------------------><
 
 

FUNCTION_statement、SUBROUTINE_statement
構文の詳細に ついては、FUNCTIONおよび SUBROUTINEを参照して ください。

specification_part
ステートメントおよび実行の順序で、(2) および (5) の 番号が付けられたステートメント・グループのステートメント・シーケンスです。

end_function_statement、end_subroutine_statement
構文の詳細については、ENDを参照してください。

インターフェース本体またはプロシージャー宣言ステートメントでは、 プロシージャーの特性のすべてを指定します。 インターフェースの概念を参照してください。 その特性は、サブプログラムの定義で指定した内容と一致している必要があります。 ただし、以下の場合を除きます。

  1. 仮引き数の名前は一致しなくてもかまいません。
  2. プロシージャーは、 純粋であると定義しているサブプログラムであるとしても、 純粋であることを示す必要はありません。
  3. 純粋な実引き数を、純粋でないダミー・プロシージャーに関連付けることができます。
  4. 組み込みエレメント型プロシージャーをダミー・プロシージャーと関連付けるとき、ダミー・プロシージャーは エレメント型である必要はありません。

インターフェース本体の specification_part は、 プロシージャーの特性を決定しないデータ・オブジェクトの属性指定や 値の定義を行うステートメントを含めることが可能です。 そのような仕様ステートメントは、インターフェースに影響を及ぼしません。 インターフェース・ブロックは、その特性がモジュール・サブプログラム定義で 定義されるモジュール・プロシージャーの特性を指定しません。

インターフェース本体には、ENTRY ステートメント、 DATA ステートメント、FORMAT ステートメント、 ステートメント関数ステートメント、または実行可能ステートメントを 入れることはできません。 入り口インターフェースを指定することにより、入り口名を インターフェース本体内のプロシージャー名として使用することができます。

インターフェース本体は、IMPORT ステートメントが指定されていない場合には、 ホスト関連付けによって名前付けエンティティーにアクセスすることはありません。 インターフェース本体はデフォルトの暗黙規則付きのホストと 同様に扱われます。 暗黙規則の説明については、型の決め方を参照してください。

インターフェース・ブロックは、総称または非総称のいずれかです。 総称インターフェース・ブロックは、INTERFACE ステートメント内で 総称仕様を指定しなければなりませんが、非総称インターフェース・ブロックでは そのような総称仕様を指定する必要はありません。 詳細については、INTERFACEを参照してください。

非総称インターフェース・ブロック内部のインターフェース本体には、 サブルーチンおよび関数双方のインターフェースを入れることができます。

総称名は、単一の名前を指定してインターフェース・ブロック内のすべてのプロシージャーを参照します。 総称名でのプロシージャー参照が発生するたびに、 最大 1 つの特定のプロシージャーが呼び出されます。

MODULE PROCEDURE ステートメントが使用できるのは、 インターフェース・ブロックが総称仕様が指定されていて、かつ各プロシージャー名が モジュール・プロシージャーとしてアクセス可能な有効範囲単位内に 入れられている場合だけです。

MODULE PROCEDURE ステートメントで使用されるプロシージャー名は、 アクセス可能なインターフェース・ブロック中の MODULE PROCEDURE ステートメントでこれまでに同一の総称識別子を指定して 指定された名前にすることはできません。

+----------------------------------IBM 拡張----------------------------------+

Fortran 以外のサブプログラムに対するインターフェースの 場合、FUNCTION または SUBROUTINE ステートメント内の仮引き数リストにより、 引き渡し方法を明示的に指定できます。 詳細については、仮引き数を参照してください。

+------------------------------End of 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 属性に指定するか、または仮引き数の インターフェースを確保する必要があります。 IBM Copyright 2003