ナビゲーション:前へ 上へ 次へ
例:
ナビゲーション:前へ 上へ 次へ
5.4 BIND(C)手続き
Cから呼び出すことが可能なFortranの手続きは、 手続きの頭部分でBIND(C)属性を指定して定義します。 デフォルトではFortran名を小文字に変換したC名が使用されます。 異なる名前を指定するにはNAME=節を利用します。例:
SUBROUTINE sub() BIND(C,NAME='Sub') ...繰り返しますがCの名前はCでのみ使用し、Fortranの名前はFortranでのみ使用します。 Cの名前がすべて空白もしくはゼロの長さを持つ文字列であった場合、 Cの名前は存在しません。このような手続きであっても手続きポインタを介して (つまりTYPE(C_FUNPTR)変数にその値を代入することによって) Cからコールすることが可能です。
すべてのBIND(C)手続きには明示的な引用仕様が必要です。
BIND(C)手続きはサブルーチン、 もしくはCの型に対応する型を持ったスカラ関数であっても構いません。 それぞれの仮引数はC型に対応する型の変数でなくてはならず、割付け、形状引継ぎ、 省略可能、ポインタは許されていません。 仮引数がVALUE属性を持たない場合には、 ポインタのC仮引数に対応することになります。
以下にFortran手続きとそれをCから参照する例を示します:
SUBROUTINE find_minmax(x,n,max,min) BIND(C,NAME='FindMinMax') USE iso_c_binding REAL(c_double) x(*),max,min INTEGER(c_int),VALUE :: n INTRINSIC maxval,minval max = MAXVAL(x(:n)) min = MINVAL(x(:n)) END extern void FindMinMax(double *x,int n,double *maxval,double *minval); double x[100],xmax,xmin; int n; ... FindMinMax(x,n,&xmax,&xmin);
引用仕様ブロック内で呼ぶ出されるC手続きを記述することによって、
Cの手続きをFortranから呼び出すことも可能にします。
例を示します:
/* This is the prototype for a C library function from 4.3BSD. */ int getloadavg(double loadavg[],int nelem); PROGRAM show_loadavg USE iso_c_binding INTERFACE FUNCTION getloadavg(loadavg,nelem) BIND(C) IMPORT c_double,c_int REAL(c_double) loadavg(*) INTEGER(c_int),VALUE :: nelem INTEGER(c_int) getloadavg END FUNCTION END INTERFACE REAL(c_double) averages(3) IF (getloadavg(averages,3)/=3) THEN PRINT *,'Unexpected error' ELSE PRINT *,'Load averages:',averages END IF END
ナビゲーション:前へ 上へ 次へ