モジュール

モジュールには、他のプログラム単位から使用できる仕様 および定義が入っています。 これらの定義には、データ・オブジェクト定義、名前リスト・グループ、 派生型定義、プロシージャーのインターフェース・ブロック、および プロシージャー定義があります。

+-------------------------Fortran 2003 ドラフト標準--------------------------+

Fortran 2003 ドラフト標準 には、組み込み型および非組み込み型の 2 つの型のモジュールが組み込まれます。 XL Fortran は組み込みモジュールを提供し、非組み込みモジュールはユーザー定義となります。

組み込みモジュールには、 プログラム単位、共通ブロック、外部プロシージャー、クリティカル・セクション、 またはグローバル・エンティティーの バインディング・ラベルなど、その他のグローバル・エンティティーと同じ名前を指定できます。 有効範囲単位は、同じ名前を持つ組み込みモジュールと非組み込みモジュールの両方を使用することはできません。

+----------------------End of Fortran 2003 ドラフト標準----------------------+

+----------------------------------IBM 拡張----------------------------------+

Fortran 90 モジュールは、グローバル・データを定義します。 これは、COMMON データのように、スレッドで共用されるため、スレッド・アンセーフとなります。 アプリケーションをスレッド・セーフにするには、 グローバル・データを THREADPRIVATE または THREADLOCAL として宣言する必要があります。詳細については、 COMMONTHREADLOCAL、 および THREADPRIVATEを参照してください。

+------------------------------End of IBM 拡張-------------------------------+



>>-MODULE_statement--------------------------------------------><
 
 
>>-+--------------------+--------------------------------------><
   '-specification_part-'
 
 
>>-+------------------------+----------------------------------><
   '-module_subprogram_part-'
 
 
>>-END_MODULE_statement----------------------------------------><
 
 

MODULE_statement
構文の詳細については、MODULEを参照してください。

specification_part
ステートメントおよび実行の順序(2)(4)(5)、 および (6) の番号が付けられたステートメント・グループのステートメント・シーケンスです。

module_subprogram_part



>>-CONTAINS_statement------------------------------------------><
 
 
   .-------------------.
   V                   |
>>---module_subprogram-+---------------------------------------><
 
 

CONTAINS_statement
構文の詳細については、CONTAINSを参照してください。

END_MODULE_statement
構文の詳細については、ENDを参照してください。

モジュール・サブプログラムは、モジュール内にありますが、 内部サブプログラムではありません。 モジュール・サブプログラムは、CONTAINS ステートメントの後に続ける必要があり、 内部プロシージャーを含むことができます。 モジュール・プロシージャーは、モジュール・サブプログラムまたは モジュール・サブプログラム内の入り口で定義します。

モジュール内の実行可能ステートメントは、 モジュール・サブプログラム内で指定されます。

文字型のモジュール関数名の宣言では、アスタリスクを 長さ指定として使用することはできません。

specification_part に、ステートメント関数ステートメント、 ENTRY ステートメント、または FORMAT ステートメントを 入れることはできませんが、これらのステートメントを モジュール・サブプログラムの仕様部分に入れることは可能です。

自動オブジェクトおよび AUTOMATIC 属性を持つオブジェクトは、 モジュールの有効範囲には入れられません。

アクセス可能なモジュール・プロシージャーは、モジュール内の別のサブプログラムか、 または使用関連付けを介したモジュールの外側の有効範囲単位 (つまり、USE ステートメントを使用することによって) によって呼び出すことができます。 詳細については、USEを参照してください。

+----------------------------------IBM 拡張----------------------------------+

ポインティング先が定数以外の境界で次元宣言子を指定する場合、 整数ポインターを specification_part に入れることができません。

モジュールの有効範囲内にあるすべてのオブジェクトは、 その関連付け状況、割り振り状況、定義状況、それから 使用関連付けを介してモジュールにアクセスする プロシージャーが RETURN または END ステートメントを 実行する際の値を保持します。 詳細については、未定義を発生させるイベントの項目 4 を参照してください。

+------------------------------End of IBM 拡張-------------------------------+

モジュールはモジュール・プロシージャーまたは派生型定義に対する ホストとなり、ホスト関連付けを介してモジュールの有効範囲内の エンティティーにアクセスできます。

モジュール・プロシージャーは、ダミー・プロシージャー引き数に 関連した実引き数として使用することができます。

モジュール・プロシージャーの名前は、モジュールの有効範囲に対して ローカルで、共通ブロック名以外のモジュール内のどのエンティティー名とも 同じにすることはできません。



マイグレーションのためのヒント:


  • 共通ブロックおよび INCLUDE ディレクティブを除去します。
  • モジュールを使用してグローバル・データおよびプロシージャーを保持し、
    定義の整合性が取れるようにします。

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
IBM Copyright 2003