FUNCTION

目的

FUNCTION ステートメントは、 関数サブプログラムの最初のステートメントです。

構文



   .------------.
   V            |
>>---+--------+-+--FUNCTION--name--+------------------+--------->
     '-prefix-'                    |   (1)       (2)  |
                                   '-*-------len------'
 
                                  .----------------------------------------------------.
                                  V                                                    |
>--(--+---------------------+--)----+------------------------------------------------+-+-><
      '-dummy_argument_list-'       +-RESULT--(--result_name--)----------------------+
                                    '-BIND--(--C--+-----------------------------+--)-'
                                                  '-,--NAME-- = --binding_label-'
 
 

注:


  1. IBM 拡張.

  2. IBM 拡張.


prefix
次のうちの 1 つです。

type_spec
RECURSIVE
FORTRAN 95 の開始 PURE FORTRAN 95 の終了
FORTRAN 95 の開始 ELEMENTAL FORTRAN 95 の終了

type_spec
関数結果の型と型付きパラメーターを指定します。 type_spec の詳細については、 型宣言を参照してください。

name
関数サブプログラムの名前です。

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

len
符号なし整数リテラル、または括弧で囲んだスカラー整数初期化式のいずれかです。 この値は関数の結果変数の長さを指定します。 FUNCTION ステートメントで型を指定した場合のみ、この値を指定できます。 型を、DOUBLE PRECISIONDOUBLE COMPLEXBYTE または派生型にすることはできません。

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

+-------------------------Fortran 2003 ドラフト標準--------------------------+

binding_label
スカラー文字初期化式

+----------------------End of Fortran 2003 ドラフト標準----------------------+

規則

最大 1 つの prefix を指定できます。

最大で 1 つの RESULT 文節と最大で 1 つの BIND 文節を指定できます。 これらは任意の順序で指定できます。

関数結果の型と型付きパラメーターは、type_spec でも、また関数サブプログラムの宣言部分で結果変数を 宣言することによっても指定できます。 ただし、両方の方法を同時に使用することはできません。 指定しない場合は、暗黙の入力規則が適用されます。 長さ指定子は type_speclen の両方では指定できません。

RESULT を指定すると、result_name は関数結果変数になります。 name は、サブプログラム内のどの仕様ステートメントにおいても 宣言することはできませんが、参照することはできます。 result_namename と同じにすることはできません。 RESULT を指定しないと、name は関数結果変数になります。

+-------------------------Fortran 2003 ドラフト標準--------------------------+

BIND キーワードは、プロシージャーが C プログラミング言語からのアクセスに使用する結合ラベルを暗黙的あるいは明示的に定義します。結果変数は、相互運用可能なスカラーでなければなりません。結合ラベルを仮引き数に対して指定することはできません。 仮引き数のサイズをゼロにすることはできません。BIND 属性を持つプロシージャーの仮引き数は、相互運用可能型および型付きパラメーターを持つ必要があり、ALLOCATABLEOPTIONAL、または POINTER 属性を持つことはできません。

BIND 属性は、内部プロシージャーに対しては指定できません。

+----------------------End of Fortran 2003 ドラフト標準----------------------+

結果変数が配列またはポインターの場合、DIMENSION また は POINTER 属性はそれぞれ関数本体で指定しなければなりません。

関数結果がポインターの場合、結果変数の形状によって 関数が戻す値の形状を決定します。 結果変数がポインターの場合、関数はターゲットをポインターと関連させるか、 あるいはポインターの関連付け状況を非関連として定義しなければなりません。

結果変数がポインターでない場合、関数はその値を定義しなければなりません。

外部関数名が派生型であり、型が使用関連付けまたは ホスト関連付けでない場合、その派生型は 順序派生型でなければなりません。

関数結果変数が変数形式設定式の中にあってはなりません。 また、関数結果変数は、COMMONDATA、整数 POINTER、または EQUIVALENCE ステートメントで指定することも、PARAMETERINTENTOPTIONAL、または SAVE 属性を持つこともできません。 結果変数が割り振り可能オブジェクト、配列、またはポインターではなく、 さらに文字型でも派生型でもない場合にのみ、STATIC および AUTOMATIC 属性を指定することができます。

関数結果変数は入り口プロシージャーの結果変数と関連を持ちます。 このことを入り口関連付けといいます。 これらの結果変数のうちの 1 つを定義すると、関連している変数のうち、 同じ型のすべての変数が定義され、 どの入り口点から入ったかに関係なく関数の値になります。

関数サブプログラムに入り口プロシージャーが含まれる場合で、 型が文字型でも派生型でもなく、結果変数が ALLOCATABLE または POINTER 属性を持つか、またはスカラーではない場合には、 結果変数は同じ型である必要はありません。 サブプログラムの中で RETURN または END ステートメントを実行するときに、 関数の参照用に名前が使用される変数は定義済み状態になっていなければなりません。関連した変数で型が異なるものは、 関数の参照中に定義済み状態にすることはできません。ただし、 関連した同じ型の変数の 1 つによって サブプログラムの実行中に、後から再定義する場合は除きます。

再帰

以下の場合、キーワード RECURSIVE を 直接または間接的に指定しなければなりません。

関数がそれ自身を直接呼び出すには、 RECURSIVERESULT の 両方のキーワードを指定しなければなりません。 この両方のキーワードが存在すると、サブプログラム内に 明示プロシージャー・インターフェースが作成されます。

name が文字型であり、関数が再帰的な場合、 その長さにアスタリスクを指定することはできません。

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

RECURSIVE を指定した場合、 結果変数のデフォルトのストレージ・クラスは自動になります。

-qrecur コンパイラー・オプションを指定すると、外部プロシージャーを 再帰的に呼び出すことができます。しかし、FUNCTION ステートメント が RECURSIVE または RESULT を指定する場合、XL Fortran は このオプションを無視します。

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

+---------------------------------Fortran 95---------------------------------+

エレメント型プロシージャー

エレメント型プロシージャーでは、キーワード ELEMENTAL を 指定しなければなりません。 ELEMENTAL キーワードを指定している場合、RECURSIVE キーワードを指定することはできません。

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

関連情報

IBM Copyright 2003