サーチ…


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_cgoose_f間でデータを転送できるようになりgoose_fGoose型の引数を取るCルーチンは、 type(goose_t) Fortranから呼び出すことができます。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow