モジュールには、他のプログラム単位から使用できる仕様および定義が入っています。これらの定義には、データ・オブジェクト定義、名前リスト・グループ、派生型定義、プロシージャーのインターフェース・ブロック、およびプロシージャー定義があります。
+----------------------------------IBM 拡張----------------------------------+
Fortran 90 モジュールは、グローバル・データを定義します。 COMMON データのように、スレッド全体で共用されるため、スレッド・アンセーフとなります。 アプリケーションをスレッド・セーフにするには、グローバル・データを THREADPRIVATE または THREADLOCAL として宣言する必要があります。詳細については、 COMMON、 THREADLOCAL、および THREADPRIVATEを参照してください。
+--------------------------------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 を参照してください。
+--------------------------------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