関連情報
ナビゲーション:Fortran 2003入門   前へ   上へ   次へ

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


Results matter. Trust NAG.
Privacy Policy | Trademarks