CプログラムとFortranプログラムのリンクは、コンパイラーベンダー依存であり、ここで示す例は、GCC3.2.3ではこのようにできるとい う範囲 の情報でしかありません。
C234567
double precision function my_f77_func(param)
double precision param
my_f77_func = 1.0 / param
return
与えられた引数の逆数を求めるだけの関数副プログラムです。Cとリンクする場合には、REAL
型を使うよりも、DOUBLE
PRECISION
型を使うほうが好都合です。
#include <stdio.h>
extern double my_f77_func__(double *);
int main()
{
double param;
double ret;
param = 2.0;
ret = my_f77_func__(¶m);
printf("my_f77_func__(%lg) returns %lg¥n", param, ret);
return 0;
}
人間がソースファイルに書いた関数名や変数名が、そのままオブジェクトプログラムに使われる訳ではありません。特に、「EAX
」
のように、レジスタ名やアセンブラの予約語と名前が衝突すると混乱が起きるので、
人間が指定した識別子の前後に、コンパイラーが下線記号やドル記号を付ける例が多いです。
GCC3.2.3の場合には、Fortran側の名前の後ろに下線記号を2個付けたものが、C側の名前になります。
Fortranの副ブログラムに引数を渡す際には、番地渡しが使われます。Cでは、値渡しが使われます。
そのために、上記の例では、double
型変数の
番地をFortran関数に渡しています。決して、C側で次のように書いてはいけません。
ret = my_f77_func__(2.0);
g77 -c fsub.f
gcc -c cmain.c
gcc cmain.o fsub.o.
/a.out
C1234567
call c_sub
stop
end
#include <stdio.h>
void c_sub__()
{
printf("Hello, world.¥n");
}
g77 fmain.f csub.c
./a.out