Fortran 2003 入門

ナビゲーション:前へ   上へ   次へ

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_PTRC_FUNPTRの利用

C_PTRC_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_PTRC_NULL_FUNPTRとなっています。

Type(c_ptr)の値を作成する場合、関数C_LOC(X)をFortranオブジェクト Xに対して使用します。その際にXTARGET属性を持つ必要があります。 この際の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_1C_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)が提供されています。

これらすべての変換操作において、型やその他の情報を正しく使うのはプログラマの責任である点に注意してください。


ナビゲーション:前へ   上へ   次へ

関連情報
ご案内
© 譌・譛ャ繝九Η繝シ繝。繝ェ繧ォ繝ォ繧「繝ォ繧エ繝ェ繧コ繝�繧コ繧ー繝ォ繝シ繝玲�ェ蠑丈シ夂、セ 2025
Privacy Policy  /  Trademarks