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

有兩種模組: 本質和非本質。 XL Fortran 提供本質模組,而非本質模組是使用者定義的。
本質模組可以具有與其他廣域實體相同的名稱,例如程式單元、一般區塊、外部程序、 重要區段 或廣域實體的連結標籤。 範圍設定單元不得同時存取具有相同名稱的本質模組及非本質模組。

模組定義廣域資料,與 COMMON 資料一樣,在執行緒之間共用,因此執行緒不安全。 若要使應用程式安全執行緒,您必須將廣域資料宣告為 THREADPRIVATE 或 THREADLOCAL。 如需相關資訊,請參閱 COMMON、 THREADLOCAL及 THREADPRIVATE 。 
語法
- MODULE_陳述式
- 如需語法詳細資料,請參閱 MODULE 。
- specification_part
- 它是 陳述式順序及執行順序中編號為 2 、 4 及 5 的陳述式群組中的陳述式順序。
- CONTAINS_statement
- 如需語法詳細資料,請參閱 CONTAINS 。
- END_MODULE_statement
- 如需語法詳細資料,請參閱 END 。
規則
模組子程式包含在模組中,但不是內部子程式。 模組子程式必須遵循 CONTAINS 陳述式,且可以包含內部程序。 模組程序是由模組子程式或模組子程式中的登錄所定義。
模組內的可執行陳述式只能在模組子程式中指定。
類型為字元的模組函數名稱宣告不能以星號作為長度規格。
specification_part 不能包含陳述式函數陳述式、 ENTRY 陳述式或 FORMAT 陳述式,雖然這些陳述式可能出現在模組子程式的規格組件中。
具有 AUTOMATIC 屬性的自動物件和物件無法出現在模組的範圍中。
可存取模組程序可由模組中的另一個子程式或模組外部的任何範圍設定單元透過使用關聯 (亦即,使用 USE 陳述式) 來呼叫。 如需詳細資料,請參閱 USE 。

如果指定具有非常數界限的維度宣告器,則整數指標無法出現在 specification_part 中。
當任何透過使用關聯來存取模組的程序執行 RETURN 或 END 陳述式時,模組範圍中的所有物件都會保留其關聯狀態、配置狀態、定義狀態及值。 如需相關資訊,請參閱 導致取消定義的事件 下的第 4 點。

模組是其包含的任何模組程序、介面區塊、衍生類型定義、
或其後代子模組
的主機。 透過主機關聯,模組程序、介面區塊、衍生類型定義
及後代子模組
可以存取模組範圍中的實體。
模組程序可以用作與虛擬程序引數相關聯的實際引數。
模組程序的名稱是模組範圍的本端名稱,不能與模組中任何實體的名稱相同,但一般區塊名稱除外。
在 specification_part中,您可以宣告模組程序介面主體,以指定個別模組程序的介面。 請參閱 範例 2。 稍後您可以在其中一個後代子模組中定義個別模組程序。
Migration Tips:
- 刪除一般區塊及 INCLUDE 指引
- 使用模組來保留廣域資料和程序,以確保定義的一致性
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 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
