11.4 データ引数の値渡し
Fortran 95 のプログラムでは、C から呼び出されるときに仮引数の VALUE 属性を使用し、Fortran 95 から呼び出す C ルーチンのために INTERFACE ブロックを追加する必要があります。
表 11–11 C と Fortran 95 の間で単純なデータ要素を渡す
Fortran 95 が C を呼び出す
|
C が Fortran 95 を呼び出す
|
PROGRAM callc
INTERFACE
INTEGER FUNCTION crtn(I)
BIND(C) crtn
INTEGER, VALUE, INTENT(IN) :: I
END FUNCTION crtn
END INTERFACE
M = 20
MM = crtn(M)
WRITE (*,*) M, MM
END PROGRAM
---------------------------------
int crtn(int x)
{
int y;
printf("%d input \n", x);
y = x + 1;
printf("%d returning \n",y);
return(y);
}
---------------------------------
Results:
20 input
21 returning
20 21
|
|
#include <stdlib.h>
int main(int ac, char *av[]) {
to_fortran_(12);
}
--------------------------------
SUBROUTINE to_fortran(i)
INTEGER, VALUE :: i
PRINT *, i
END
|
|
C ルーチンを実引数として別のデータ型で呼び出す場合は、INTERFACE ブロックに !$PRAGMA IGNORE_TKR I を含めることによって、実引数と仮引数の型、種類、ランクの一致をコンパイラから要求されないようにします。
古い FORTRAN 77 での値による呼び出しは、単純型のデータでだけ、FORTRAN 77 ルーチンが C のルーチンを呼び出す場合にかぎり使用できました。C のルーチンから FORTRAN 77 ルーチンを呼び出して、値で引数を渡す方法はありません。配列、文字列、構造体は、参照で渡すようにしてください。
FORTRAN 77 ルーチンから C ルーチンに値を渡すには、非標準の Fortran 関数 %VAL(arg) を呼び出しの中で引数として使用してください。
次の例では、FORTRAN 77 ルーチンが値により x を渡し、参照により y を渡しています。C のルーチンは x と y を増分しましたが、y だけが変更されます。
Fortran が C を呼び出す
|
Fortran ルーチン:
REAL x, y
x = 1.
y = 0.
PRINT *, x,y
CALL value( %VAL(x), y)
PRINT *, x,y
END
|
C ルーチン
void value_( float x, float *y)
{
printf("%f, %f\n",x,*y);
x = x + 1.;
*y = *y + 1.;
printf("%f, %f\n",x,*y);
}
|
コンパイルと実行による出力:
1.00000 0. Fortran から x と y を入力
1.000000, 0.000000 C から x と y を入力
2.000000, 1.000000 C から新しい x と y を入力
1.00000 1.00000 Fortran から新しい x と y を入力
|
|