MODULE

:モジュール・プログラム単位の開始を示します。これには,1 つ以上のプログラム単位で使用できる宣言と定義が含まれています。

形式

MODULE name

[specification-part]
[CONTAINS
module-subprogram
[module-subprogram] ...]
END [MODULE [name]]

name
モジュール名。

specification-part
以下のものを除く 1 つまたは複数の宣言文。

宣言文に自動割付けオブジェクトを入れることはできません。

module-subprogram
MODULE PROCEDURE を定義する関数またはサブルーチン副プログラム。関数は END FUNCTION で終わらなくてはならず,サブルーチンは END SUBROUTINE で終わらなくてはなりません。

モジュール副プログラムは内部手続を含むことができます。

規則と振る舞い

END 文の次に名前が続く場合,MODULE 文で指定された名前と同じものでなくてはなりません。

モジュール名は大域的なものと見なされ,一意でなくてはなりません。主プログラム中の局所名や,その実行形式プログラム中の他のプログラム単位,外部手続,または共通ブロックの名前であってはなりません。

モジュールは,それが含んでいるすべてのモジュール手続の親プログラムとなります。モジュール手続は,モジュール内の言語要素を親子結合を通して参照することができます。

モジュールは (直接または間接に) 自分自身を引用することはできません。

PRIVATE 属性を使って,モジュール内の手続または変数の参照を制約することができます。

ENTRY 文,FORMAT 文,および文関数はモジュールの宣言部では使用できませんが,モジュール副プログラムの宣言部では使用できます。

モジュール内の実行文は,モジュール副プログラムでしか指定できません。

モジュールは 1 つまたは複数の手続インタフェース宣言を含むことができます。これにより,外部副プログラムまたは仮副プログラムの明示的なインタフェースを指定できます。

互換性

CONSOLE STANDARD GRAPHICS QUICKWIN GRAPHICS WINDOWS DLL LIB

関連情報

PRIVATEPUBLICUSE手続インタフェースプログラム単位と手続

次の例は,大域データを提供するために使用できる単純なモジュールを示しています。

	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

この例では,構成要素 CD は型 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