関数およびサブルーチン・サブプログラム

サブプログラムは、関数またはサブルーチンのどちらかであり、 内部サブプログラム、外部サブプログラム、モジュール・サブプログラムの いずれかです。 また、ステートメント関数のステートメントに関数を指定することもできます。 外部サブプログラムは一種のプログラム単位です。



>>-subprogram_statement----------------------------------------><
 
 
>>-+--------------------+--------------------------------------><
   '-specification_part-'
 
 
>>-+----------------+------------------------------------------><
   '-execution_part-'
 
 
>>-+--------------------------+--------------------------------><
   '-internal_subprogram_part-'
 
 
>>-end_subprogram_statement------------------------------------><
 
 

subprogram_statement
構文の詳細については、FUNCTIONまたは SUBROUTINEを参照してください。

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

execution_part
ステートメントおよび実行の順序(4) および (6) の 番号が付けられたステートメント・グループのステートメント・シーケンスです。 これは、ステートメント・グループ (6) のステートメントで始まらなければなりません。

internal_subprogram_part
詳細については、内部プロシージャーを参照してください。

end_subprogram_statement
関数およびサブルーチンの END ステートメントの構文に関する詳細については、ENDを 参照してください。

内部サブプログラムは、メインプログラム、モジュール・サブプログラム、または外部サブプログラムにある CONTAINS ステートメントの で、かつ、ホスト・プログラムの END ステートメントの で宣言します。 内部サブプログラムの名前は、ホスト有効範囲単位内の仕様セクションには定義しないでください。

外部プロシージャーは、実行可能プログラムに関して グローバルな有効範囲を持っています。 呼び出し側プログラム単位では、インターフェース・ブロック内の 外部プロシージャーにインターフェースを指定したり、 EXTERNAL 属性で外部プロシージャー名を定義することができます。

サブプログラムには、PROGRAMBLOCK DATAMODULE 以外のステートメントであれば、 どのステートメントを指定してもかまいません。 内部サブプログラムには、 ENTRY ステートメントや内部サブプログラムを指定することはできません。

プロシージャー参照

プロシージャー参照には、次の 2 つのタイプがあります。

関数参照

関数参照は、次のように式の中の 1 次子として使用します。



>>-function_name--(--+---------------------------+--)----------><
                     '-actual_argument_spec_list-'
 
 

関数参照が実行されると、次のことが順番に行われます。

  1. 式である実引き数が評価されます。
  2. 実引き数が対応する仮引き数に関連付けられます。
  3. 制御が指定された関数に移ります。
  4. 関数が実行されます。
  5. 関数の結果変数の値 (または、ポインター関数の場合は、状況またはターゲット) が、 参照している式で使用可能になります。

関数参照の実行によって、その関数参照が入っているステートメント内部の 他のデータ項目値を変更しないでください。 論理 IF ステートメント または WHERE ステートメントの論理式にある関数参照の起動により、 その式の値が真である場合に実行されるステートメントのエンティティーに 影響を与える可能性があります。

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

値または参照により引き数を引き渡すことによって言語間呼び出しを容易にするために、それぞれの場合に使用するための 引き数リスト組み込み関数 %VAL および %REF が提供されています。 これらの組み込み関数は、Fortran 以外のプロシージャー参照および インターフェース本体のサブプログラム・ステートメントで指定できます。 (%VAL および %REFを参照してください。) 参照関数の例に ついては 関数ステートメントおよび 再帰を参照してください。

+------------------------------End of IBM 拡張-------------------------------+

割り振り可能な関数に入るときに、結果変数の割り振り状況は、現在割り振られていない状態になります。

関数の結果変数は、関数の実行中に何度でも割り振りまたは割り振り解除を行うことができます。 ただし、それが現在割り振り済みで、関数を終了するときに定義済みの値を持ちます。 結果変数の自動割り振り解除は、関数を終了するときには即時には行われません。 その代わりに、関数の参照が発生するステートメントの実行後に行われます。

サブプログラムおよびプロシージャー参照の例

PROGRAM MAIN
REAL QUAD,X2,X1,X0,A,C3
QUAD=0; A=X1*X2
X2 = 2.0
X1 = SIN(4.5)                    ! Reference to intrinsic function
X0 = 1.0
CALL Q(X2,X1,X0,QUAD)            ! Reference to external subroutine
C3 = CUBE()                      ! Reference to internal function
CONTAINS
  REAL FUNCTION CUBE()           ! Internal function
    CUBE = A**3
  END FUNCTION CUBE
END
SUBROUTINE Q(A,B,C,QUAD)         ! External subroutine
  REAL A,B,C,QUAD
  QUAD = (-B + SQRT(B**2-4*A*C)) / (2*A)
END SUBROUTINE Q

割り振り可能な関数の結果の例

FUNCTION INQUIRE_FILES_OPEN() RESULT(OPENED_STATUS)
  LOGICAL,ALLOCATABLE :: OPENED_STATUS(:)
  INTEGER I,J
  LOGICAL TEST
  DO I=1000,0,-1
    INQUIRE(UNIT=I,OPENED=TEST,ERR=100)
    IF (TEST) EXIT
100 CONTINUE
  END DO
  ALLOCATE(OPENED_STATUS(0:I))
  DO J=0,I
    INQUIRE(UNIT=J,OPENED=OPENED_STATUS(J))
  END DO
END FUNCTION INQUIRE_FILES_OPEN
 
IBM Copyright 2003