文:モジュール・プログラム単位の開始を示します。これには,1 つ以上のプログラム単位で使用できる宣言と定義が含まれています。
形式
MODULE name
name
モジュール名。
specification-part
以下のものを除く 1 つまたは複数の宣言文。
ENTRY
FORMAT
AUTOMATIC (またはそれと等価な属性)
INTENT (またはそれと等価な属性)
OPTIONAL (またはそれと等価な属性)
文関数
宣言文に自動割付けオブジェクトを入れることはできません。
module-subprogram
MODULE PROCEDURE を定義する関数またはサブルーチン副プログラム。関数は END FUNCTION で終わらなくてはならず,サブルーチンは END SUBROUTINE で終わらなくてはなりません。
モジュール副プログラムは内部手続を含むことができます。
規則と振る舞い
END 文の次に名前が続く場合,MODULE 文で指定された名前と同じものでなくてはなりません。
モジュール名は大域的なものと見なされ,一意でなくてはなりません。主プログラム中の局所名や,その実行形式プログラム中の他のプログラム単位,外部手続,または共通ブロックの名前であってはなりません。
モジュールは,それが含んでいるすべてのモジュール手続の親プログラムとなります。モジュール手続は,モジュール内の言語要素を親子結合を通して参照することができます。
モジュールは (直接または間接に) 自分自身を引用することはできません。
PRIVATE 属性を使って,モジュール内の手続または変数の参照を制約することができます。
ENTRY 文,FORMAT 文,および文関数はモジュールの宣言部では使用できませんが,モジュール副プログラムの宣言部では使用できます。
モジュール内の実行文は,モジュール副プログラムでしか指定できません。
モジュールは 1 つまたは複数の手続インタフェース宣言を含むことができます。これにより,外部副プログラムまたは仮副プログラムの明示的なインタフェースを指定できます。
互換性
CONSOLE STANDARD GRAPHICS QUICKWIN GRAPHICS WINDOWS DLL LIB
関連情報
PRIVATE,PUBLIC,USE,手続インタフェース,プログラム単位と手続
例
次の例は,大域データを提供するために使用できる単純なモジュールを示しています。
MODULE MOD_A INTEGER :: B, C REAL E(25,5) END MODULE MOD_A ... SUBROUTINE SUB_Z USE MOD_A ! スカラ変数 B と C,配列 E を ... ! このサブルーチンで利用可能にする。 END SUBROUTINE SUB_Z
次の例は,モジュール手続を示しています。
MODULE RESULTS ... CONTAINS FUNCTION MOD_RESULTS(X,Y) ! モジュール手続 ... END FUNCTION MOD_RESULTS END MODULE RESULTS
次の例は,構造型を含んでいるモジュールを示しています。
MODULE EMPLOYEE_DATA TYPE EMPLOYEE INTEGER ID CHARACTER(LEN=40) NAME END TYPE EMPLOYEE END MODULE
次の例は,インタフェース宣言を含んでいるモジュールを示しています。
MODULE ARRAY_CALCULATOR INTERFACE FUNCTION CALC_AVERAGE(D) REAL :: CALC_AVERAGE REAL, INTENT(IN) :: D(:) END FUNCTION END INTERFACE END MODULE ARRAY_CALCULATOR
次の例は,非公開構成要素を含んでいる,公開構造型定義を示しています。
MODULE MATTER TYPE ELEMENTS PRIVATE INTEGER C, D END TYPE ... END MODULE MATTER
この例では,構成要素 C と D は型 ELEMENTS に対して非公開ですが,型 ELEMENTS はモジュール MATTER に対して非公開ではありません。モジュール MATTER を使用するプログラム単位は,型 ELEMENTS の変数を宣言し,型 ELEMENTS の引数値として渡すことができます。
このような設計により,モジュールを使用する他のプログラム単位に影響を与えることなく,特定の型の構成要素を変更することが可能となります。
同じ構造型を複数のプログラム単位で使用する必要がある場合,定義をモジュール内に置き,以下のように必要に応じて USE 文で参照します。
MODULE STUDENTS TYPE STUDENT_RECORD ... END TYPE CONTAINS SUBROUTINE COURSE_GRADE(...) TYPE(STUDENT_RECORD) NAME ... END SUBROUTINE END MODULE STUDENTS ... PROGRAM SENIOR_CLASS USE STUDENTS TYPE(STUDENT_RECORD) ID ... END PROGRAM
プログラム SENIOR_CLASS は,モジュール STUDENTS を使用しているため,型 STUDENT_RECORD を参照することができます。モジュール手続 COURSE_GRADE も,その親プログラムに構造型定義が含まれているので,型 STUDENT_RECORD を参照することができます。
以下に他の例を示します。
MODULE mod1 REAL(8) a,b,c,d INTEGER(4) Int1, Int2, Int3 CONTAINS function fun1(x) ... end function fun1 END MODULE