C関数からFortran関数を呼び出す

CプログラムとFortranプログラムのリンクは、コンパイラーベンダー依存であり、ここで示す例は、GCC3.2.3ではこのようにできるとい う範囲 の情報でしかありません。

Fortran側の呼び出される関数

C234567
double precision function my_f77_func(param)
double precision param
my_f77_func = 1.0 / param
return

与えられた引数の逆数を求めるだけの関数副プログラムです。Cとリンクする場合には、REAL型を使うよりも、DOUBLE PRECISION型を使うほうが好都合です。

C側の呼び出す関数

#include <stdio.h>

extern double my_f77_func__(double *);

int main()
{
double param;
double ret;

param = 2.0;
ret = my_f77_func__(&param);
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

逆に、FortranからCを呼び出す

Fortranのプログラム「fmain.f」

C1234567
call c_sub
stop
end

Cのプログラム「csub.c」

#include <stdio.h>

void c_sub__()
{
printf("Hello, world.¥n");
}

コンパイルと実行

g77 fmain.f csub.c
./a.out

(C) 2003-2004 石川直太 無保証 BSDライセンス
C/C++ tips に[戻る]
Tips に[戻る]
石川直太のホームページに[戻る]