FORTRAN77からCに文字列を渡す

大信田 丈志
作成: 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文字の文字列として表示されれば 成功である。

[g77のページに戻る] [ホームページ]


str01main.F


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

str01sub.c

#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);
}

[g77のページに戻る] [ホームページ]