文:関数副プログラムの最初の文です。関数副プログラムは,式で呼び出され,式の評価に使用される 1 つの値 (関数結果) を返します。
形式
[prefix] FUNCTION name ([d-arg-list]) [RESULT (r-name)]
prefix
(省略可能) 以下のいずれか。
type [keyword]
keyword [type]
type
データ型指定子。
keyword
以下のいずれか。
キーワード | 意味 |
RECURSIVE | 直接の再帰を可能にします。関数が直接に再帰的で,配列値である場合,RESULT も指定しなくてはなりません 。 |
PURE | 手続が副作用を持たないことを指定します 。 |
ELEMENTAL | 一度に 1 つの配列要素に作用する,純粋手続の制約された形式です。 |
name
関数の名前。RESULT が指定されている場合,関数名は,関数副プログラムの有効域のどの宣言文にも現れてはなりません。
関数名の次に,データ型の長さを続けることができます。長さは,星印 (*) の次に,その関数の型にとって有効な長さである任意の符号なしの非ゼロ整数を付けることで指定されます。たとえば,REAL FUNCTION LGFUNC*8 (Y, Z) は,関数結果を REAL(8) (または REAL*8) として指定しています。
この省略可能な文字長宣言は,文字長がすでに CHARACTER キーワードの後に指定されている場合には許されません。
d-arg-list
(省略可能) 1 つまたは複数の仮引数並び。
r-name
(省略可能) 関数結果名。この名前は関数名と同じであってはなりません。
規則と振る舞い
関数結果の型と種別パラメタ (存在する場合) は,関数副プログラム中の FUNCTION 文か型宣言文で定義することができますが,この両方で定義することはできません。型が指定されていない場合,その関数副プログラムで有効になっている暗黙の型付け規則によって決定されます。
実行は,FUNCTION 文の次にくる最初の実行構文または文から開始されます。END 文 (または RETURN 文) が実行された時点で,制御は呼び出し側のプログラム単位に返ります。
CHARACTER*(*) を宣言すると,関数は,それを呼び出しているプログラム単位中で宣言された文字長を取ります。この種の文字関数は,どのプログラム単位から呼び出されたかによって,異なる文字長を持つことになります。これは Fortran 95 の廃止予定事項です。
文字長が整定数として指定される場合,その値は,関数を呼び出しているプログラム単位で指定された関数の長さと一致しなくてはなりません。長さが指定されていない場合,長さは 1 と仮定されます。
関数が配列値またはポインタである場合,関数中の宣言は,関数結果名に対してこれらの属性を指定していなくてはなりません。関数結果属性の宣言,仮引数属性の宣言,および手続の先頭の文の情報を合わせたものが,関数のインタフェースを定義します。
関数が実行を完了した時点で,結果変数の値が返されます。結果がポインタであるかどうかによって,以下の規則が適用されます。
関数から返される値の形状は,関数が実行を完了した時点での結果変数の形状によって決定されます。
結果がポインタでない場合,その値は関数が実行を完了する前に定義されていなくてはなりません。結果が配列ならば,すべての要素が定義されている必要があります。結果が構造型構造体ならば,すべての構成要素が定義されている必要があります。
関数副プログラムは,SUBROUTINE 文,BLOCK DATA 文,PROGRAM 文,または他の FUNCTION 文を含むことはできません。ENTRY 文を使って,副プログラムに複数のエントリ・ポイントを用意することが可能です。
関数が以下の型のいずれでもない場合,CALL 文を使って関数を呼び出すことができます。
REAL(8)
REAL(16) (VMS, U*X)
COMPLEX(8)
COMPLEX(16) (VMS, U*X)
CHARACTER
互換性
CONSOLE STANDARD GRAPHICS QUICKWIN GRAPHICS WINDOWS DLL LIB
関連情報
ELEMENTAL,ENTRY,PURE,RESULT キーワード,SUBROUTINE,関数引用,関数とサブルーチン副プログラムの一般的な規則,プログラム単位と手続
例
次の例は,Newton-Raphson 反復法 (F(X) = cosh(X) + cos(X) - A = 0) を使って平方根を計算しています。
FUNCTION ROOT(A) X = 1.0 DO EX = EXP(X) EMINX = 1./EX ROOT = X - ((EX+EMINX)*.5+COS(X)-A)/((EX-EMINX)*.5-SIN(X)) IF (ABS((X-ROOT)/ROOT) .LT. 1E-6) RETURN X = ROOT END DO END
上の例では,Xi と Xi+1 の差が 1.0E-6 よりも小さくなるまで,次の式が計算されます。
cosh(Xi) + cos(Xi) - A Xi+1 = Xi - ---------------------------- sinh(Xi) - sin(Xi)
次の例は,引継ぎ文字長の文字関数を示しています。
CHARACTER*(*) FUNCTION REDO(CARG) CHARACTER*1 CARG DO I=1,LEN(REDO) REDO(I:I) = CARG END DO RETURN END FUNCTION
この関数は,関数の文字長だけ引数の値を繰り返して充填したものを返します。
1 つのプログラム単位中では,引継ぎ文字長の文字関数引用はすべて同じ文字長を持っていなくてはなりません。次の例では,関数 REDO の文字長は 1000 です。
CHARACTER*1000 REDO, MANYAS, MANYZS MANYAS = REDO('A') MANYZS = REDO('Z')
実行形式プログラム中の別のプログラム単位は,異なる文字長を宣言することができます。たとえば,次の関数 REDO の文字長は 2 です。
CHARACTER HOLD*6, REDO*2 HOLD = REDO('A')//REDO('B')//REDO('C')
次の例は,動的な配列値関数を示しています。
FUNCTION SUB (N) REAL, DIMENSION(N) :: SUB ... END FUNCTION
以下に他の例を示します。
INTEGER Divby2 10 PRINT *, 'Enter a number' READ *, i Print *, Divby2(i) GOTO 10 END ! ! これは関数定義です。 ! INTEGER FUNCTION Divby2 (num) Divby2=num / 2 END FUNCTION