XL Fortran for AIX V8.1.1

ランゲージ・リファレンス


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

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



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

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

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

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

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を参照してください。) 参照関数の例については 関数ステートメントおよび 再帰を参照してください。

+--------------------------------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
 


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]