Sun Studio 12: Fortran プログラミングガイド

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 を入力