功能

用途

FUNCTION 陳述式是函數子程式的第一個陳述式。

語法

讀取語法圖跳過視覺化語法圖字首FUNCTION名稱 *1Len (dummy_argument_list) RESULT(result_name)BIND2(C, NAME = binding_label)
附註:
  • 1 IBM 延伸
  • 2 Fortran 2003
字首
是下列其中一項:
  • 宣告 _type_spec
  • ELEMENTAL
  • IMPURE
  • Fortran 2008 開始MODULEFortran 2008 結束
  • PURE
  • RECURSIVE
宣告 _type_spec
指定函數結果的類型及類型參數。 如需 declaration_type_spec的詳細資料,請參閱 類型宣告
名稱
函數子程式的名稱。
len
不帶正負號的整數文字或用括弧括住的純量整數 常數表示式len 的值指定函數結果變數的長度。 只有在 FUNCTION 陳述式中指定類型時,才能包含它。 類型不能是 DOUBLE PRECISIONDOUBLE COMPLEXBYTE或衍生類型。
binding_label
純量字元 常數表示式

規則

最多只能指定每一種 字首 的其中一種。 您不能同時指定 RECURSIVEELEMENTAL 字首指定元。 您不能同時指定 PUREIMPURE 字首指定元。

最多可以出現一個 RESULT 子句,以及最多一個 BIND 子句。 它們可以依任何順序出現。

函數結果的類型和類型參數可以由 declaration_type_spec 或在函數子程式的宣告組件中宣告結果變數來指定,但不能同時由兩者來指定。 如果完全未指定它們,則隱含的鍵入規則會生效。 長度指定元不能同時由 declaration_type_speclen指定。

如果指定 RESULTresult_name 會變成函數結果變數。 name 不得在子程式的任何規格陳述式中宣告,但可以參照它。 result_name 不得與 名稱相同。 如果未指定 RESULT名稱 會變成函數結果變數。

Fortran 2003 開始 BIND 關鍵字隱含或明確定義連結標籤,可用來從 C 程式設計語言存取程序。 結果變數必須是可交互作業的純量。 虛擬引數不能是零大小。 具有 BIND 屬性之程序的虛擬引數必須具有可交互作業類型及類型參數,且不能具有 ALLOCATABLEPOINTER 屬性。

如果 FUNCTION 陳述式顯示為說明虛擬程序之介面主體的一部分,則 NAME= 指定元不得出現。 元素程序不能具有 BIND 屬性。Fortran 2003 結束

如果結果變數是陣列或指標,則必須在函數主體內分別指定 DIMENSIONPOINTER 屬性。

如果函數結果是指標,則結果變數的形狀會決定函數所傳回值的形狀。 如果結果變數是指標,則函數必須將目標與指標相關聯,或將指標的關聯狀態定義為解除關聯。

如果結果變數不是指標,則函數必須定義其值。

如果外部函數的名稱是衍生類型,則如果類型不是使用相關聯或主機相關聯,則衍生類型必須是序列衍生類型。

函數結果變數不得出現在變數格式表示式中,也不能指定在 COMMONDATA、整數 POINTEREQUIVALENCE 陳述式中,也不能具有 PARAMETERINTENTOPTIONALSAVE 屬性。 只有在結果變數不是可配置物件、陣列或指標,且不是字元或衍生類型時,才能指定 STATICAUTOMATIC 屬性。

函數結果變數與任何輸入程序結果變數相關聯。 這稱為項目關聯。 任何這些結果變數的定義都會變成具有該相同類型及類型參數之所有關聯變數的定義,而且不論進入點為何,都是函數的值。

如果函數子程式包含輸入程序,則除非類型為字元或衍生類型,或變數具有 ALLOCATABLEPOINTER 屬性,或變數不是尺度變數,否則結果變數不需要是相同類型。 在子程式中執行 RETURNEND 陳述式時,其名稱用來參照函數的變數必須處於已定義狀態。 在執行函數參照期間,不得定義不同類型的關聯變數,除非稍後在執行子程式期間,重新定義相同類型及類型參數的關聯變數。

Fortran 2008 開始
您可以針對模組子程式或模組或子模組的範圍設定單元中所宣告的非抽象介面主體,指定 FUNCTION 陳述式的 MODULE 字首指定元。 請參閱 範例 2
  • 當您為模組子程式的 FUNCTION 陳述式指定 MODULE 字首指定元時,模組子程式是個別模組程序。
  • 當您為非抽象介面主體的 FUNCTION 陳述式指定 MODULE 字首指定元時,介面主體是模組程序介面主體。

內部程序不容許具有 NAME= 指定元的 BIND 屬性。

Fortran 2008 結束

範例 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

相關資訊