11.1 FortranとCの混合
Fortran 90/95のコードとCのコードを混在させる場合、以下の点に留意してください。
11.1.1 ネーミング規約
外部手続き名と共通ブロック名は小文字にアンダスコアを付加したものです(これは 標準UNIX f77と同じです)。メインプログラム単位の名前は‘main’と なります。モジュール変数とモジュール手続き名はモジュール名(小文字)に ‘_MP_’を付加、さらに言語要素名(小文字)を付加する形で構成され ます。
注:これらの規約は-f77 オプションを使用した場合には異なる可能性 があります。例えばWindowsにおいてこのオプションを指定すると、外部手続き名と共通 ブロック名は大文字でかつアンダスコアが付かないものとなる一方、モジュール要素は モジュール名を小文字ではなく大文字で持つことになります。
11.1.2 初期化と終了
メインプログラムがFortranで書かれていない場合には初期化ルーチン
f90_init(int argc,char*argv[])
または入出力初期化ルーチン
f90_io_init(void)
のいずれかをCからコールする必要があります。
f90_initルーチンはFortranの浮動小数点環境を初期化すると共に、
F90_UNIXモジュールからのコマンド行引数に対するアクセスを可能にします。
またプログラムはf90_finish(int status)によって終了させる必要がありま すが、通常のC終了ルーチンを用いてすべてのFortranファイルのクローズ、Fortran 入出力バッファのフラッシュを行う前に、f90_io_finish(void)をコールする というアプローチも取れます。
11.1.3 呼出し規約
以下のセクションでは、nAG Fortranコンパイラを用いてコンパイルされたFortran プログラムによって用いられる呼出し規約を、Cの用語を用いて詳細に記述します。 従ってこの情報はFortranとCのコードを混在させたいと考えている人にとって最も 有用と言えます。Fortran 90/95/2003のFortran 77サブセットを対象とした規約はデファクトである Unix f77規約と互換性があります(-f77 オプションを用いずに コンパイルされたCOMPLEX関数を除く)。
11.1.4 データタイプ
CからFortranへの交信に役立つデータタイプの定義は、通常 /usr/local/lib/nAG_Fortran中に置かれているnagfortran.hファイル の中にあります。
| Fortranデータタイプ | Fortran精度 | C typedef名 |
| INTEGER | 8 bits | Integer1 |
| 16 bits | Integer2 | |
| 32 bits | Integer または Integer3 | |
| 64 bits | Integer4 | |
| LOGICAL | 8 bits | Logical1 |
| 16 bits | Logical2 | |
| 32 bits | Logical | |
| 64 bits | Logical4 | |
| REAL | single | Real |
| double | Double | |
| double-double | DDReal | |
| quadruple | QReal | |
| COMPLEX | single | Complex |
| double | DComplex | |
| double-double | DDComplex | |
| quadruple | QComplex |
DDRealとQRealはほとんどのシステムで同一です。ただしSun Solarisにおいてはこれら は異なります(後者はIEEE互換の128ビット浮動小数点型となります)。
11.1.4.1 ポインタ
スカラで多相でないPOINTER型は単にオブジェクトに対するCポインタです。配列POINTER型は対象の配列を記述するドープベクトル(dope vectors)です。 単なるアドレスとは異なり、これらのドープベクトルは連続な配列中における不連続 な部分配列を直接記述することができます。 詳細については下記(DopeN とChDopeN)をご参照ください。
11.1.4.2 構造型
Fortranの構造型はCのstructに翻訳されます。 BIND(C)またはSEQUENCEが使用された場合には、構造体内の項目の順序は 構造型定義中における順序と同一になります。 そうでない場合には、並び方を改善し記憶容量を減らすべく順序の入れ替えが行われ、 より大きな型が構造体の先頭の方に置かれることになります。順序を確認するにはCの 出力コードを調べる必要があります。11.1.4.3 サポートタイプ
- Substring —
- struct { unsigned char *addr; Chrlen len;}
CHARACTER列を記述します。可変長のスカラnon-POINTER CHARACTER 関数、及びすべてのPOINTER CHARACTER関数の戻りタイプとして使用されます。 - Offset —
- int, long または long long
アドレス付けと添え字計算のための整数型です。これは32ビットシステム及び小型64ビット システム上ではint(32ビット)、大型の64ビットシステム上では64ビット整数 型です。 - Chrlen —
- 通常int
文字長を表すための整数型です。 - Pointer —
- 通常char *
任意の型を参照するために、及びポインタ算術用に使用されるバイトポインタです。 - Triplet —
- struct { Offset extent,mult,lower;}
配列次元のパラメータを含みます。extentはその次元のサイズを、multは 刻み幅(連続した要素間の距離(単位バイト))を、lowerは下限を表します。 これはDopeN, ChDopeN構造体の成分です。 - DopeN —
- struct { Pointer addr; Offset offset; Triplet dim[N];}
すべての非多相non-CHARACTER配列(構造型の配列を含む)に対するドープベク トルです。N は次元数を意味し1から7までです。addrは最初の要素のアド レスであり、dimはそれぞれの次元を記述します。offsetは添え字計算 に足されるオフセット、すなわちSUM(mult*lower)を表します。これは POINTER配列関数に対する戻りタイプとして使用されます。それに対するポイン タは形状引継ぎ配列、POINTER配列引数用の引数タイプとして使用されます。ヌル化された配列ポインタはヌルポインタであるaddrフィールドを持ちます。 ゼロサイズの配列はヌルポインタではないaddrフィールドを持つので注意し てください。
- ChDopeN —
- struct { Pointer addr; Chrlen len; Offset offset; Triplet dim[N];}
DopeN 構造体にCHARACTER長を指定するlen成分が加わった ものです。 - ArrayTemp_type —
- struct { type *addr; Offset extent[7];}
type がInteger1, Integer2, Integer, Integer4, Logical1, Logical2, Logical, Logical4, Real, Double, QReal, Complex, DComplex, QComplex のいずれかである連続配列を記述します。 それはnon-POINTER配列関数に対する戻りタイプとして使用されます。 配列の次元数より後のextent値は不定である点に注意してください。 - ArrayTemp_Character —
- struct { char *addr; Chrlen len; Offset extent[7];}
連続なCHARACTER配列を記述します。他の配列型と同じですが、 CHARACTER長に対するlen成分が追加されています。 - ArrayTemp_Derived —
- ArrayTemp_Characterと同義
任意の構造型の連続配列を記述します。 この場合のlenは構造型配列要素のサイズを表します。
11.1.5 SUBROUTINE戻りタイプ
11.1.5.1 ラベル引数を持つSUBROUTINE
戻りタイプはintです。その値は制御を移す先のラベルに対するインデックス (最初のラベルであれば1、以下同様)を表します。 ゼロ、または範囲外の値は制御の移行を伴わないことを示します。11.1.5.2 ラベル引数を持たないSUBROUTINE
戻りタイプはvoidです。11.1.6 FUNCTION戻りタイプ
11.1.6.1 スカラ、non-POINTER関数
-
INTEGER, LOGICAL, REAL
上記組込み型。 -
COMPLEX, -f77 オプション使用せず
精度に応じてComplex、またはDComplex。 -
COMPLEX, -f77 オプション使用
戻りタイプはvoidです。 型がComplexまたはDComplexの一時データのアドレスが関数の初期引数 として渡されます(結果はその位置に書き込まれます)。 -
CHARACTER, 固定長または長さ引継ぎ
戻りタイプはvoidです。 2つの追加の初期引数が関数に引き渡されます。1番目のもの(char*)は結果 を書き込む場所を示すアドレスを、2番目のもの(Chrlen)は結果の長さ(呼 ばれた関数が長さ引継ぎ型の場合)を示します。 -
CHARACTER, 可変長
戻りタイプはSubstring(上記参照)です。 呼ばれた関数は文字列用の記憶領域を割付けます。その領域が必要なくなったときに それを解放するのは呼出し元の責任です。 -
構造型
構造体。
11.1.6.2 スカラPOINTER関数
すべてのPOINTER値関数に関し、結果がポイントする記憶領域は呼ばれる関数 内で割付けられていることもあれば、結果が既存の記憶領域をポイントしていること もある点に注意してください。-
INTEGER, LOGICAL, REAL, COMPLEX
適切な組込み型(例えばComplex*)へのポインタ。 -
CHARACTER
戻りタイプはSubstringです。 -
構造型
構造体へのポインタ。
11.1.6.3 配列non-POINTER関数
-
組込み型
上記組込み型に対する適切なArrayTemp_構造体。 -
構造型
そのlen成分が構造体のサイズにセットされた形でArrayTemp_Derivedが 応答として返されます。
11.1.6.4 配列POINTER関数
-
Non-CHARACTER型
配列の次元数に応じてDope1, Dope2, ... , Dope7のいずれか。 -
CHARACTER
配列の次元数に応じてChDope1, ChDope2, ... , ChDope7のい ずれか。
構造型配列はDopeN 構造体として返される点に注意してください。
11.1.7 引数タイプ
11.1.7.1 CHARACTER型
CHARACTER型の通常の引数はすべて、CHARACTER言語要素の長さを示す Chrlen引数を伴っています。この追加引数はすべての通常の引数よりも後、 引数並びの末尾で引き渡されます。CHARACTER引数が複数ある場合、その長さ は左から右に順に引き渡されます。このルールに対する唯一の例外は形状引継ぎCHARACTER配列です。この場合、 仮引数の長さはドープベクトル中のフィールドから直接取得され、別個に引き渡される ことはありません。
11.1.7.2 non-POINTERスカラ
-
non-CHARACTER型
引数のアドレスが引き渡されます(例:INTEGER引数の場合のInteger*)。 -
CHARACTER
引数のアドレスが引き渡されると共に、引数の長さが別のint引数として引数 並びの末尾で引き渡されます。
11.1.7.3 POINTERスカラ
これらはポインタのアドレスが引き渡される点を除くと、non-POINTERの場合と 同様の形で引き渡されます(例:INTEGER POINTERの場合のInteger**)。11.1.7.4 non-POINTER配列
-
引継ぎ形状
配列を記述する適切なドープベクトルのアドレスが引き渡されます (すなわちDopeN*またはChDopeN*)。 配列は部分配列で記述できる限り連続である必要はありません。 -
その他
配列の最初の要素のアドレスが引き渡されます。 CHARACTER配列の場合、それぞれの配列要素の長さはスカラに対する場合と 同様、引数並びの末尾でChrlenとして引き渡されます。 配列は連続でなくてはなりません。
