功能
用途
FUNCTION 陳述式是函數子程式的第一個陳述式。
語法
- 字首
- 是下列其中一項:
- 宣告 _type_spec
- ELEMENTAL
IMPURE
MODULE
- PURE
- RECURSIVE
- 宣告 _type_spec
- 指定函數結果的類型及類型參數。 如需 declaration_type_spec的詳細資料,請參閱 類型宣告 。
- 名稱
- 函數子程式的名稱。
len- 不帶正負號的整數文字或用括弧括住的純量整數 常數表示式。 len 的值指定函數結果變數的長度。 只有在 FUNCTION 陳述式中指定類型時,才能包含它。 類型不能是 DOUBLE PRECISION、 DOUBLE
COMPLEX、 BYTE或衍生類型。

binding_label- 純量字元 常數表示式。

規則
最多只能指定每一種 字首 的其中一種。 您不能同時指定 RECURSIVE 和 ELEMENTAL 字首指定元。
您不能同時指定 PURE 和 IMPURE 字首指定元。
最多可以出現一個 RESULT 子句,以及最多一個 BIND 子句。 它們可以依任何順序出現。
函數結果的類型和類型參數可以由 declaration_type_spec 或在函數子程式的宣告組件中宣告結果變數來指定,但不能同時由兩者來指定。 如果完全未指定它們,則隱含的鍵入規則會生效。 長度指定元不能同時由 declaration_type_spec 和 len指定。
如果指定 RESULT , result_name 會變成函數結果變數。 name 不得在子程式的任何規格陳述式中宣告,但可以參照它。 result_name 不得與 名稱相同。 如果未指定 RESULT , 名稱 會變成函數結果變數。
BIND 關鍵字隱含或明確定義連結標籤,可用來從 C 程式設計語言存取程序。 結果變數必須是可交互作業的純量。 虛擬引數不能是零大小。 具有 BIND 屬性之程序的虛擬引數必須具有可交互作業類型及類型參數,且不能具有 ALLOCATABLE 或 POINTER 屬性。
如果 FUNCTION 陳述式顯示為說明虛擬程序之介面主體的一部分,則 NAME= 指定元不得出現。 元素程序不能具有 BIND 屬性。
如果結果變數是陣列或指標,則必須在函數主體內分別指定 DIMENSION 或 POINTER 屬性。
如果函數結果是指標,則結果變數的形狀會決定函數所傳回值的形狀。 如果結果變數是指標,則函數必須將目標與指標相關聯,或將指標的關聯狀態定義為解除關聯。
如果結果變數不是指標,則函數必須定義其值。
如果外部函數的名稱是衍生類型,則如果類型不是使用相關聯或主機相關聯,則衍生類型必須是序列衍生類型。
函數結果變數不得出現在變數格式表示式中,也不能指定在 COMMON、 DATA、整數 POINTER或 EQUIVALENCE 陳述式中,也不能具有 PARAMETER、 INTENT、 OPTIONAL或 SAVE 屬性。 只有在結果變數不是可配置物件、陣列或指標,且不是字元或衍生類型時,才能指定 STATIC 和 AUTOMATIC 屬性。
函數結果變數與任何輸入程序結果變數相關聯。 這稱為項目關聯。 任何這些結果變數的定義都會變成具有該相同類型及類型參數之所有關聯變數的定義,而且不論進入點為何,都是函數的值。
如果函數子程式包含輸入程序,則除非類型為字元或衍生類型,或變數具有 ALLOCATABLE 或 POINTER 屬性,或變數不是尺度變數,否則結果變數不需要是相同類型。 在子程式中執行 RETURN 或 END 陳述式時,其名稱用來參照函數的變數必須處於已定義狀態。 在執行函數參照期間,不得定義不同類型的關聯變數,除非稍後在執行子程式期間,重新定義相同類型及類型參數的關聯變數。

- 當您為模組子程式的 FUNCTION 陳述式指定 MODULE 字首指定元時,模組子程式是個別模組程序。
- 當您為非抽象介面主體的 FUNCTION 陳述式指定 MODULE 字首指定元時,介面主體是模組程序介面主體。
內部程序不容許具有 NAME= 指定元的 BIND 屬性。

範例 1
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
範例 2 (Fortran 2008)
MODULE m
! The MODULE prefix specifier is specified for the FUNCTION
! statement of a module procedure interface body.
INTERFACE
INTEGER MODULE FUNCTION func(a, b)
INTEGER :: a, b
END FUNCTION
END INTERFACE
END MODULE
SUBMODULE (m) n
CONTAINS
! The MODULE prefix specifier is specified for the FUNCTION
! statement of a separate module procedure.
INTEGER MODULE FUNCTION func(a, b) RESULT (res)
INTEGER :: a, b
res = a + b
END FUNCTION
END SUBMODULE
