CのプログラムとFORTRANのプログラムを混在して使いたい場合いくつか注意 する必要があります。まずCプログラムの中からFORTRANサブプログラムを呼ぶ 場合を考えてみましょう。
それぞれの言語の枠の中では関数名や変数名などユーザが定義したとおりに 使ってきましたが、異なる言語処理系では実はそのままには見えません。nmコ マンドで.oファイルを見れば解かりますが、コンパイラーが自動的に名前を修 正します。例えば
% cat test.c int inc1( i ) int i; { return i + 1; } % cc -c test.c % nm test.o 00000000 T _inc1 %
C言語の枠組みではinc1という関数を定義したのですが、オブジェクトモジュー ルの中には_inc1と、前に_を付けた名前になって保存されています。同じよう にFORTRANの場合、
% cat testf.f integer function inc1( i ) integer i inc1 = i + 1 return end % f77 -c testf.f % nm testf.o 00000000 T _inc1_
今度は前と後ろに_が付きました。FORTRANの場合自動的に前と後ろに_を付け ていることがわかりました。このことからCからFORTRANサブプログラムを呼び 出すときには関数名の後に_を付けて呼び出せばよいということになります。 (前に付ける_はCコンパイラが自動的にやってくれます。)
次に考えなければならないのは引数の与え方です。Cの場合は基本的に値を 渡しますがF ORTRANの場合はすべて参照を渡します。その結果CからFORTRANを 呼ぶ場合すべて引数はポインターで渡してやらなければなりません。上の例で FORTRANのinc1をCから呼び出す場合、
/* Cプログラムの中 */ int i, j; i = 10; j = inc1_( & i ); /* FORTRAN のinc1を呼んだ */
ということになります。関数の値の戻し方は同じです。このように任意の FORTRANサブプログラムをCから呼ぶことができることがわかります。
CのプログラムとFORTRANプログラムで最も取り扱い方が異なるのは文字列で す。Cでは0 (ヌル文字)で終端される任意長さの文字列を扱いますが、FORTRAN では文字列変数は固定長で、代入された長さが変数の長さより短い場合は空白 が埋められます。また、文字列の最後にヌル文字を付けてはくれません。です からstrlen関数では正しい長さが返らないことに注意しましょう。FORTRANの 関数lnblnkは文字列変数の最後に埋められた空白の最初の位置を返します。
こういったことに注意しながら文字列を扱う例を見ていきましょう。
subroutine sub1( str1, str2 ) character str1*40, str2*80
という関数をCから呼ぶときは
char str1[ 40 ], str2[ 80 ]; sub1_( str1, str2 );
というように同じ長さの文字列を宣言しておく必要があります。では次の場合 はどうでしょう。
subroutine sub2( str1, str2 ) character str1*(*), str2*(*)
固定長なのに長さが指定されていません。この場合はFORTRANプログラムでは 見えない隠れた引数が必要になります。Cからは次のように呼び出すことにな ります。
char str1[ 40 ], str2[ 80 ]; sub2_( str1, str2, 40, 80 );
*(*)型の引数の分だけ文字列の実際の長さを引数に追加します。かなり苦しい 感じがしますね。