モジュールには、他のプログラム単位から使用できる仕様 および定義が入っています。 これらの定義には、データ・オブジェクト定義、名前リスト・グループ、 派生型定義、プロシージャーのインターフェース・ブロック、および プロシージャー定義があります。
+-------------------------Fortran 2003 ドラフト標準--------------------------+
Fortran 2003 ドラフト標準 には、組み込み型および非組み込み型の 2 つの型のモジュールが組み込まれます。 XL Fortran は組み込みモジュールを提供し、非組み込みモジュールはユーザー定義となります。
組み込みモジュールには、 プログラム単位、共通ブロック、外部プロシージャー、クリティカル・セクション、 またはグローバル・エンティティーの バインディング・ラベルなど、その他のグローバル・エンティティーと同じ名前を指定できます。 有効範囲単位は、同じ名前を持つ組み込みモジュールと非組み込みモジュールの両方を使用することはできません。
+----------------------End of Fortran 2003 ドラフト標準----------------------+
+----------------------------------IBM 拡張----------------------------------+
Fortran 90 モジュールは、グローバル・データを定義します。 これは、COMMON データのように、スレッドで共用されるため、スレッド・アンセーフとなります。 アプリケーションをスレッド・セーフにするには、 グローバル・データを THREADPRIVATE または THREADLOCAL として宣言する必要があります。詳細については、 COMMON、 THREADLOCAL、 および THREADPRIVATEを参照してください。
+------------------------------End of IBM 拡張-------------------------------+
>>-MODULE_statement-------------------------------------------->< >>-+--------------------+-------------------------------------->< '-specification_part-' >>-+------------------------+---------------------------------->< '-module_subprogram_part-' >>-END_MODULE_statement---------------------------------------->< |
>>-CONTAINS_statement------------------------------------------>< .-------------------. V | >>---module_subprogram-+--------------------------------------->< |
モジュール・サブプログラムは、モジュール内にありますが、 内部サブプログラムではありません。 モジュール・サブプログラムは、CONTAINS ステートメントの後に続ける必要があり、 内部プロシージャーを含むことができます。 モジュール・プロシージャーは、モジュール・サブプログラムまたは モジュール・サブプログラム内の入り口で定義します。
モジュール内の実行可能ステートメントは、 モジュール・サブプログラム内で指定されます。
文字型のモジュール関数名の宣言では、アスタリスクを 長さ指定として使用することはできません。
specification_part に、ステートメント関数ステートメント、 ENTRY ステートメント、または FORMAT ステートメントを 入れることはできませんが、これらのステートメントを モジュール・サブプログラムの仕様部分に入れることは可能です。
自動オブジェクトおよび AUTOMATIC 属性を持つオブジェクトは、 モジュールの有効範囲には入れられません。
アクセス可能なモジュール・プロシージャーは、モジュール内の別のサブプログラムか、 または使用関連付けを介したモジュールの外側の有効範囲単位 (つまり、USE ステートメントを使用することによって) によって呼び出すことができます。 詳細については、USEを参照してください。
+----------------------------------IBM 拡張----------------------------------+
ポインティング先が定数以外の境界で次元宣言子を指定する場合、 整数ポインターを specification_part に入れることができません。
モジュールの有効範囲内にあるすべてのオブジェクトは、 その関連付け状況、割り振り状況、定義状況、それから 使用関連付けを介してモジュールにアクセスする プロシージャーが RETURN または END ステートメントを 実行する際の値を保持します。 詳細については、未定義を発生させるイベントの項目 4 を参照してください。
+------------------------------End of IBM 拡張-------------------------------+
モジュールはモジュール・プロシージャーまたは派生型定義に対する ホストとなり、ホスト関連付けを介してモジュールの有効範囲内の エンティティーにアクセスできます。
モジュール・プロシージャーは、ダミー・プロシージャー引き数に 関連した実引き数として使用することができます。
モジュール・プロシージャーの名前は、モジュールの有効範囲に対して ローカルで、共通ブロック名以外のモジュール内のどのエンティティー名とも 同じにすることはできません。
マイグレーションのためのヒント:
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 または Fortran 95 ソース: 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 |
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 CALL SUB() ! module M END PROGRAM