Fortran
Cの相互運用性
サーチ…
FortranからCを呼び出す
Fortran 2003は、CとFortranの間の相互運用性を保証する言語機能を導入しました(さらにC言語を仲介者として使用することにより)。これらの機能は、主にintrinsicモジュールiso_c_binding
介してアクセスされます。
use, intrinsic :: iso_c_binding
ここのintrinsic
キーワードは、正しい名前のモジュールをユーザーが作成するのではなく、正しいモジュールが使用されるようにします。
iso_c_binding
は、 相互運用可能な種類の型パラメータへのアクセスを提供します。
integer(c_int) :: foo ! equivalent of 'int foo' in C
real(c_float) :: bar ! equivalent of 'float bar' in C
C種類のパラメータを使用すると、CとFortranプログラム間でデータを転送できることが保証されます。
CのcharとFortran文字の相互運用性はおそらくそれ自体の話題であるため、ここでは論じません
実際にFortranからC関数を呼び出すには、まずインターフェイスを宣言する必要があります。これは本質的にC関数のプロトタイプと同じであり、コンパイラに引数の数と型などを知らせるbind
属性は、コンパイラにCの関数の名前を伝えるために使われる。これはFortran名。
geese.h
// Count how many geese are in a given flock
int howManyGeese(int flock);
geese.f90
! Interface to C routine
interface
integer(c_int) function how_many_geese(flock_num) bind(C, 'howManyGeese')
! Interface blocks don't know about their context,
! so we need to use iso_c_binding to get c_int definition
use, intrinsic :: iso_c_binding, only : c_int
integer(c_int) :: flock_num
end function how_many_geese
end interface
howManyGeese()
実装を含むCライブラリ( コンパイラ依存、ここに含まれていますか? )にFortranプログラムをリンクし、次にhow_many_geese()
をFortranからhow_many_geese()
があります。
FortranのC構造体
bind
属性は、派生型にも適用できます。
geese.h
struct Goose {
int flock;
float buoyancy;
}
struct Goose goose_c;
geese.f90
use, intrinsic :: iso_c_binding, only : c_int, c_float
type, bind(C) :: goose_t
integer(c_int) :: flock
real(c_float) :: buoyancy
end type goose_t
type(goose_t) :: goose_f
goose_c
とgoose_f
間でデータを転送できるようになりgoose_f
。 Goose
型の引数を取るCルーチンは、 type(goose_t)
Fortranから呼び出すことができます。