大信田 丈志
作成: 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);
}