目的
FUNCTION ステートメントは、関数サブプログラムの最初のステートメントです。
構文
.------------. V | >>---+--------+-+--FUNCTION--name--+------------------+---------> '-prefix-' | (1) (2) | '-*-------len------' >--(--+---------------------+--)--+---------------------------+->< '-dummy_argument_list-' '-RESULT--(--result_name--)-' 注:
|
+----------------------------------IBM 拡張----------------------------------+
+--------------------------------IBM 拡張の終り-------------------------------+
規則
最大 1 つの prefix を指定できます。
関数結果のタイプと型付きパラメーターは type_spec でも関数サブプログラムの宣言部分で結果変数を宣言することによっても指定できます。ただし、両用の方法を同時に使用することはできません。指定しない場合は、暗黙の入力規則が適用されます。長さ指定子は type_spec と len の両方では指定できません。
RESULT を指定すると、result_name は関数結果変数になります。 name は、サブプログラム内のどの仕様ステートメントにおいても宣言することはできませんが、参照することはできます。 result_name を name と同じにすることはできません。 RESULT を指定しないと、name は関数結果変数になります。
結果変数が配列またはポインターの場合、DIMENSION または POINTER 属性はそれぞれ関数本体で指定しなければなりません。
関数結果がポインターの場合、結果変数の形状によって関数が戻す値の形状を決定します。結果変数がポインターの場合、関数はターゲットをポインターと関連させるか、あるいはポインターの関連付け状況を非関連として定義しなければなりません。
結果変数がポインターでない場合、関数はその値を定義しなければなりません。
外部関数名が派生型であり、タイプが使用関連付けまたはホスト関連付けでない場合、その派生型は順序派生型でなければなりません。
関数結果変数を変数形式設定式の中に置いてはいけません。また、関数結果変数は、COMMON、DATA、整数 POINTER、または EQUIVALENCE ステートメントで指定することも、 PARAMETER、INTENT、OPTIONAL、または SAVE 属性を持つこともできません。結果変数が割り振り可能なオブジェクト、配列、またはポインターではなく、かつ文字タイプでも派生型でもない場合にのみ、STATIC および AUTOMATIC 属性を指定することができます。
関数結果変数は入り口プロシージャーの結果変数と関連を持ちます。このことを入り口関連付けといいます。これらの結果変数のうちの 1 つを定義すると、関連している変数のうち、同じタイプのすべての変数が定義され、どのエントリー・ポイントから入ったかに関係なく関数の値になります。
関数サブプログラムに入り口プロシージャーが含まれ、タイプが文字タイプでも派生型でもなく、結果変数が POINTER 属性を持つか、またはスカラーではない場合、結果変数は同じタイプである必要はありません。サブプログラムの中で RETURN または END ステートメントを実行するときに、関数の参照用に名前が使用される変数は定義済み状態になっていなければなりません。関連した変数でタイプが異なるものは、関数の参照中に定義済み状態にすることはできません。ただし、関連した同じタイプの変数の 1 つによってサブプログラムの実行中に、後から再定義する場合は除きます。
以下の場合、キーワード RECURSIVE を直接または間接的に指定しなければなりません。
関数がそれ自身を直接呼び出すには、 RECURSIVE と RESULT の両方のキーワードを指定しなければなりません。この両方のキーワードが存在すると、サブプログラム内に明示プロシージャー・インターフェースが作成されます。
name が文字タイプであり、関数が再帰的な場合、その長さにアスタリスクを指定することはできません。
+----------------------------------IBM 拡張----------------------------------+
RECURSIVE を指定した場合、結果変数のデフォルトのストレージ・クラスは自動になります。
-qrecur コンパイラー・オプションを指定すると、外部プロシージャーを再帰的に呼び出すことができます。しかし、FUNCTION ステートメントが RECURSIVE または RESULT を指定する場合、XL Fortran はこのオプションを無視します。
+--------------------------------IBM 拡張の終り-------------------------------+
+---------------------------------Fortran 95---------------------------------+
エレメント型プロシージャーでは、キーワード ELEMENTAL を指定しなければなりません。 ELEMENTAL キーワードを指定している場合、RECURSIVE キーワードを指定することはできません。
+------------------------------Fortran 95 の終り------------------------------+
RECURSIVE FUNCTION FACTORIAL (N) RESULT (RES) INTEGER RES IF (N.EQ.0) THEN RES=1 ELSE RES=N*FACTORIAL(N-1) END IF END FUNCTION FACTORIAL
PROGRAM P INTERFACE OPERATOR (.PERMUTATION.) ELEMENTAL FUNCTION MYPERMUTATION(ARR1,ARR2) INTEGER :: MYPERMUTATION INTEGER, INTENT(IN) :: ARR1,ARR2 END FUNCTION MYPERMUTATION END INTERFACE INTEGER PERMVEC(100,150),N(100,150),K(100,150) ... PERMVEC = N .PERMUTATION. K ... END
関連情報