サブプログラムは、関数またはサブルーチンのどちらかであり、内部サブプログラム、外部サブプログラム、モジュール・サブプログラムのいずれかです。また、ステートメント関数のステートメントに関数を指定することもできます。外部サブプログラムは一種のプログラム単位です。
>>-subprogram_statement---------------------------------------->< >>-+--------------------+-------------------------------------->< '-specification_part-' >>-+----------------+------------------------------------------>< '-execution_part-' >>-+--------------------------+-------------------------------->< '-internal_subprogram_part-' >>-end_subprogram_statement------------------------------------>< |
内部サブプログラムは、メインプログラム、モジュール・サブプログラム、または外部サブプログラムにある CONTAINS ステートメントの 後 で、そしてホスト・プログラムの END ステートメントの 前 で宣言します。内部サブプログラムの名前は、ホスト有効範囲単位内の仕様セクションには定義しないでください。
外部プロシージャーは、実行可能プログラムに関してグローバルな有効範囲を持っています。呼び出し側プログラム単位では、インターフェース・ブロック内の外部プロシージャーにインターフェースを指定したり、 EXTERNAL 属性で外部プロシージャー名を定義することができます。
サブプログラムには、PROGRAM、 BLOCK DATA、 MODULE 以外のステートメントであれば、どのステートメントを指定してもかまいません。 内部サブプログラムには、 ENTRY ステートメントや内部サブプログラムを指定することはできません。
プロシージャー参照には、次の 2 つのタイプがあります。
関数参照は、次のように式の中の 1 次子として使用します。
>>-function_name--(--+---------------------------+--)---------->< '-actual_argument_spec_list-' |
関数参照が実行されると、次のことが順番に行われます。
関数参照の実行によって、その関数参照が入っているステートメント内部の他のデータ項目値を変更しないでください。 論理 IF ステートメント または WHERE ステートメントの論理式にある関数参照の起動により、その式の値が真である場合に実行されるステートメントのエンティティーに影響を与える可能性があります。
+----------------------------------IBM 拡張----------------------------------+
値および参照により引き数を引き渡すことによって言語間呼び出しを容易にするために、それぞれの場合に使用するための引き数リスト組み込み関数 %VAL および %REF が提供されています。これらの組み込み関数は、Fortran 以外のプロシージャー参照およびインターフェース本体のサブプログラム・ステートメントで指定できます。 (%VAL および %REFを参照してください。) 参照関数の例については 関数ステートメントおよび 再帰を参照してください。
+--------------------------------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