大信田 丈志
作成: 2000-10-22
たいていのUNIX系の環境では、 FORTRANとCを組み合わせてコンパイルすることができる。 以下の例では、GNUの FORTRANコンパイラ(g77)とCコンパイラ(gcc)を用いて、 FORTRANの主プログラムから Cの関数(サブルーチンあるいは副プログラム)を呼び出すプログラムを コンパイルしている。
このような場合、データの受け渡しの形式に注意しなければならない。 特に、文字列の受け渡しがちょっと面倒である。 具体的には、Cの関数を、次のことに注意して書く必要がある:
コンパイルおよびリンクの手順は次のとおり:
% g77 -c str01main.F
% gcc -c str01sub.c
% g77 str01main.o str01sub.o -o str01
最後のリンク段階でgccでなくg77を用いていることに注意: これによって、必要なライブラリがリンクされる。
無事にリンクできたら、次のようにコマンドを実行してみる:
% ./str01
実行した結果、 msg1( = greet = 'hello world' + 空白 )が 20文字の文字列として、 alpha( = x )が 数値50として、 msg2( ='test' )が 4文字の文字列として表示されれば 成功である。
C 文字列をサブルーチンに渡す C C 参考文献: 「UNIX C プログラミング」 (D.A. Curry) アスキー C g77.info -- "Other Languages" C g77.info -- "Debugging and Interfacing" -- "Procedures" program main character greet*20 real x greet = 'hello world' x = 50 call str01(greet,x,'test') stop end
#include <stdio.h> #include <ctype.h> #include <f2c.h> /* f2c.h のなかで ftnlen を定義している */ void showstr(const char name[], char s[], ftnlen len) { int i; printf("%s = [", name); for( i=0 ; i<len; i++ ) { putchar( isprint(s[i]) ? s[i] : '*' ); } printf("%s\n", "]"); } void str01_(char msg1[], float *alpha, char msg2[], ftnlen n1, ftnlen n2) { /* FORTRANからは str01(msg1,alpha,msg2) のように見えるはず */ printf("n1 = %2d \t", n1); showstr("msg1", msg1, n1); printf("n2 = %2d \t", n2); showstr("msg2", msg2, n2); printf("alpha=%g\n", *alpha); }