模組

模組包含可從其他程式單元存取的規格及定義。 這些定義包括資料物件定義、名單群組、衍生類型定義、程序介面區塊及程序定義。

Fortran 2003 開始

有兩種模組: 本質和非本質。 XL Fortran 提供本質模組,而非本質模組是使用者定義的。

本質模組可以具有與其他廣域實體相同的名稱,例如程式單元、一般區塊、外部程序、 重要區段 或廣域實體的連結標籤。 範圍設定單元不得同時存取具有相同名稱的本質模組及非本質模組。

Fortran 2003 結束

IBM 延伸開始 模組定義廣域資料,與 COMMON 資料一樣,在執行緒之間共用,因此執行緒不安全。 若要使應用程式安全執行緒,您必須將廣域資料宣告為 THREADPRIVATETHREADLOCAL。 如需相關資訊,請參閱 COMMONTHREADLOCALTHREADPRIVATEIBM 延伸結束

語法

模組
讀取語法圖跳過視覺化語法圖MODULE_statement
讀取語法圖跳過視覺化語法圖specification_part
讀取語法圖跳過視覺化語法圖module_subprogram_part
讀取語法圖跳過視覺化語法圖END_MODULE_statement
模組 _subprogram_part
讀取語法圖跳過視覺化語法圖CONTAINS_statement
讀取語法圖跳過視覺化語法圖module_subprogram
MODULE_陳述式
如需語法詳細資料,請參閱 MODULE
specification_part
它是 陳述式順序及執行順序中編號為 2 4 5 的陳述式群組中的陳述式順序。
CONTAINS_statement
如需語法詳細資料,請參閱 CONTAINS
END_MODULE_statement
如需語法詳細資料,請參閱 END

規則

模組子程式包含在模組中,但不是內部子程式。 模組子程式必須遵循 CONTAINS 陳述式,且可以包含內部程序。 模組程序是由模組子程式或模組子程式中的登錄所定義。

模組內的可執行陳述式只能在模組子程式中指定。

類型為字元的模組函數名稱宣告不能以星號作為長度規格。

specification_part 不能包含陳述式函數陳述式、 ENTRY 陳述式或 FORMAT 陳述式,雖然這些陳述式可能出現在模組子程式的規格組件中。

具有 AUTOMATIC 屬性的自動物件和物件無法出現在模組的範圍中。

可存取模組程序可由模組中的另一個子程式或模組外部的任何範圍設定單元透過使用關聯 (亦即,使用 USE 陳述式) 來呼叫。 如需詳細資料,請參閱 USE

IBM 延伸開始

如果指定具有非常數界限的維度宣告器,則整數指標無法出現在 specification_part 中。

當任何透過使用關聯來存取模組的程序執行 RETURNEND 陳述式時,模組範圍中的所有物件都會保留其關聯狀態、配置狀態、定義狀態及值。 如需相關資訊,請參閱 導致取消定義的事件 下的第 4 點。

IBM 延伸結束

模組是其包含的任何模組程序、介面區塊、衍生類型定義、 Fortran 2008 開始或其後代子模組Fortran 2008 結束的主機。 透過主機關聯,模組程序、介面區塊、衍生類型定義 Fortran 2008 開始及後代子模組Fortran 2008 結束 可以存取模組範圍中的實體。

模組程序可以用作與虛擬程序引數相關聯的實際引數。

模組程序的名稱是模組範圍的本端名稱,不能與模組中任何實體的名稱相同,但一般區塊名稱除外。

Fortran 2008 開始specification_part中,您可以宣告模組程序介面主體,以指定個別模組程序的介面。 請參閱 範例 2。 稍後您可以在其中一個後代子模組中定義個別模組程序。Fortran 2008 結束

Migration Tips:

  • 刪除一般區塊及 INCLUDE 指引
  • 使用模組來保留廣域資料和程序,以確保定義的一致性
FORTRAN 77 來源:
      COMMON /BLOCK/A, B, C, NAME, NUMBER
      REAL A, B, C
      A = 3
      CALL CALLUP(D)
      PRINT *, NAME, NUMBER
      END
      SUBROUTINE CALLUP (PARM)
        COMMON /BLOCK/A, B, C, NAME, NUMBER
        REAL A, B, C
        ...
        NAME = 3
        NUMBER = 4
      END
Fortran 90/95/2003 資料來源:
        MODULE FUNCS
          REAL A, B, C            ! Common block no longer needed
          INTEGER NAME, NUMBER    ! Global data
          CONTAINS
             SUBROUTINE CALLUP (PARM)
               ...
               NAME = 3
               NUMBER = 4
             END SUBROUTINE
        END MODULE FUNCS
        PROGRAM MAIN
        USE FUNCS
        A = 3
        CALL CALLUP(D)
        PRINT *, NAME, NUMBER
        END

範例 1

MODULE m
  INTEGER some_data
  
  CONTAINS
    SUBROUTINE sub()                   ! Module subprogram
      INTEGER stmtfnc
      stmtfnc(i) = i + 1
      some_data = stmtfnc(5) + inner(3)
      CONTAINS
        INTEGER FUNCTION inner(iarg)   ! Internal subprogram
          inner = iarg * 2
        END FUNCTION
    END SUBROUTINE sub
END MODULE

PROGRAM main
  USE m              ! Main program accesses module m
  CALL sub()
END PROGRAM

範例 2 (Fortran 2008)

MODULE m
  INTERFACE                             
    ! A module procedure interface body that specifies the
    ! interface of a separate module subroutine
    MODULE SUBROUTINE sub(arg)
      INTEGER :: arg
    END SUBROUTINE

    ! A module procedure interface body that specifies the
    ! interface of a separate module function
    INTEGER MODULE FUNCTION func(a, b)
      INTEGER :: a, b
    END FUNCTION  
  END INTERFACE
END MODULE

相關資訊