-dyncom (ダイナミック共用) オプションは、実行時に共通ブロックの割り当てを制御するために使用します。
このオプションは、共通ブロックを動的にするために指定します。そのデータの領域がコンパイル時ではなく実行時に割り当てられます。ダイナミック共通ブロックの宣言を含む各ルーチンへの入口で、共通ブロックの領域が割り当てられているかどうかがチェックされます。ダイナミック共通ブロックがまだ割り当てられていない場合は、そのチェック時に領域が割り当てられます。
次の例のコマンドラインでは、実行時に動的に割り当てられる共通ブロックの名前とともに、ダイナミック共用オプションを指定しています。
ifort -dyncom "blk1,blk2,blk3" test.f
blk1、blk2、および blk3 は、動的にされる共通ブロックの名前です。
次に、-dyncom (ダイナミック共用) オプションを使用する場合に注意する必要のあるいくつかの制限を示します。
ダイナミック COMMON 内のエンティティを、DATA 文で初期化してはいけません。
指定された COMMON ブロックだけがダイナミック COMMON として指定されます。
ダイナミック COMMON 内のエンティティを、スタティック COMMON 内のエンティティまたはDATAで初期化された変数とともに EQUIVALENCE 式で使用してはいけません。
ダイナミック共通ブロックを使用する主な理由は、独自の割り当てルーチンの提供によって共通ブロックの割り当てが制御できるからです。独自の割り当てルーチンを使用するには、そのルーチンを Fortran ランタイム・ライブラリの前にリンクする必要があります。このルーチンは、正しいルーチン名を生成するために、C 言語で記述されなければなりません。
このルーチンのプロトタイプは、次のとおりです。
void _FTN_ALLOC(void **mem, int *size, char *name);
ここで
mem は、共通ブロックの基底ポインタの場所です。このポインタは、このルーチンによって、割り当てられるブロックメモリを指すように設定しなければなりません。
size は、プログラム内で宣言され、コンパイラが共通ブロックに割り当てる必要があると判断したメモリのバイト数 (整数)。この値を無視して、目的に合った任意の値を使用できます。
注
割り当てる領域のサイズ (バイト数) を返す必要があります。_FTN_ALLOC() を呼び出すライブラリ・ルーチンにより、この共通ブロックの他のすべてのオカレンスが、割り当てた領域に適合することが保証されます。size パラメータの変更によって、割り当てる領域のサイズ (バイト数) を返します。
name は、動的に割り当てられる共通ブロックの名前です。
ランタイム・ライブラリ・ルーチン f90_dyncom は、メモリ割り当てを実行します。コンパイラは、ダイナミック共通ブロックを含むプログラム内の各ルーチンの開始時に、このルーチンを呼び出します。次に、このライブラリ・ルーチンが _FTN_ALLOC() を呼び出して、メモリを割り当てます。デフォルトでは、コンパイラが、各ルーチンで宣言されたとおりの共通ブロックのサイズ (バイト数) を f90_dyncom に渡し、次にそのサイズが _FTN_ALLOC() に渡ります。別のルーチンにおいて異なるサイズで宣言された同じ名前の共通ブロックを持つ非標準の拡張を使用する場合、その共通ブロックの宣言を含むルーチンが呼び出される順序によっては、ランタイム・エラーが発生する可能性があります。
Fortarn ランタイム・ライブラリには、単に要求されたバイト数を割り当てて返す _FTN_ALLOC() のデフォルトのバージョンが含まれます。