5.1 ISO_C_BINDING モジュール
Fortran 2003で新たに追加された組込みモジュールISO_C_BINDINGには次のものが含まれています。- 例えばfloatなどのそれぞれのCの型について対応するFortran型の種別パラメタとして利用可能な名前付き定数
- Cオブジェクトポインタと関数ポインタとの相互運用性を支援するC_PTR型と C_FUNPTR型
- FortranとCポインタを操作するための手続き
5.1.1 種別パラメタ
種別パラメタ名は対応するFortran型を利用するためのものです。 例えば整数型に対してはINTEGER、浮動小数点型に対してはREALがあります。 次の表はその対応を示したものです。 確実に利用可能なのはc_intのみである点に注意してください。 もし対応する型がない場合には値が負となります。
Cの型 | Fortranの型と種別 |
_Bool | LOGICAL(c_bool) |
char | CHARACTER(c_char) — For characters as text. |
double | REAL(c_double) |
double _Complex | COMPLEX(c_double_complex) or COMPLEX(c_double) |
float | REAL(c_float) |
float _Complex | COMPLEX(c_float_complex) or COMPLEX(c_float) |
int | INTEGER(c_int) |
int16_t | INTEGER(c_int16_t) |
int32_t | INTEGER(c_int32_t) |
int64_t | INTEGER(c_int64_t) |
int8_t | INTEGER(c_int8_t) |
int_fast16_t | INTEGER(c_int_fast16_t) |
int_fast32_t | INTEGER(c_int_fast32_t) |
int_fast64_t | INTEGER(c_int_fast64_t) |
int_fast8_t | INTEGER(c_int_fast8_t) |
int_least16_t | INTEGER(c_int_least16_t) |
int_least32_t | INTEGER(c_int_least32_t) |
int_least64_t | INTEGER(c_int_least64_t) |
int_least8_t | INTEGER(c_int_least8_t) |
intmax_t | INTEGER(c_intmax_t) |
intptr_t | INTEGER(c_intptr_t) |
long | INTEGER(c_long) |
long double | REAL(c_long_double) |
long double _Complex | COMPLEX(c_long_double_complex) or COMPLEX(c_long_double) |
long long | INTEGER(c_long_long) |
short | INTEGER(c_short) |
signed char | INTEGER(c_signed_char) — For characters as integers. |
size_t | INTEGER(c_size_t) |
5.1.2 C_PTRとC_FUNPTRの利用
C_PTRとC_FUNPTRは構造型名なのでType(c_ptr)とType(c_funptr)として使用できます。 Type(c_ptr)はCのvoid *とほぼ同等であり、任意のオブジェクトポインタを収容することができます。 Type(c_funptr)は関数ポインタについて同様の機能を提供します。Cの‘int *’のような引数の場合に、Type(c_ptr)を使う必要はありません。 通常の仮引数(この場合Integer(c_int)型のもの)をVALUE属性無しで使用できます。 しかしより複雑なポインタ引数(例えばポインタからポインタ)やポインタ変数及びポインタ成分に対しては、 Type(c_ptr)を使用する必要があります。
Type(c_ptr)とType(c_funptr)のNullポインタ定数はそれぞれC_NULL_PTRとC_NULL_FUNPTRとなっています。
Type(c_ptr)の値を作成する場合、関数C_LOC(X)をFortranオブジェクト Xに対して使用します。その際にXはTARGET属性を持つ必要があります。 この際のFortranオブジェクトは多相、ゼロの大きさの配列、大きさ引継ぎ配列、配列ポインタのいずれも許されていません。 Type(c_funptr)の値を作成する場合、関数C_FUNLOCを手続きに対して使用します。 この手続きはBIND(C)属性を持っている必要があります。
Type(c_ptr)もしくはType(c_funptr)がヌルであるかどうかを調べるには C_ASSOCIATED(C_PTR_1)関数が利用できます。 この関数はC_PTR_1がヌルでない場合に限り.TRUE.を返します。 2つのType(c_ptr)もしくは2つのType(c_funptr)の値は C_ASSOCIATED(C_PTR_1,C_PTR_2)関数を用いて比較できます。 C_PTR_1とC_PTR_2が同じCアドレスを持つ場合に限り.TRUE. が返されます。
サブルーチンC_F_POINTER(CPTR,FPTR)はTYPE(C_PTR)の値CPTRをスカラのFortranポインタFPTRに変換します。 このFortranポインタは任意の型で構いませんが(相互運用性のない型を含む)、多相であってはなりません。 サブルーチンC_F_POINTER(CPTR,FPTR,SHAPE)はTYPE(C_PTR)の値をFortran配列ポインタFPTRに変換します。 ここでSHAPEは1次元の整数配列で、FPTRの次元数と同じ要素数を持つものです。 結果となるFPTRの下限値はすべて1です。
TYPE(C_FUNPTR) CPTRをFortran手続きポインタFPTRに変換するために、 サブルーチンC_F_PROCPOINTER(CPTR,FPTR)が提供されています。
これらすべての変換操作において、型やその他の情報を正しく使うのはプログラマの責任である点に注意してください。
ナビゲーション:前へ 上へ 次へ