4.4.3 2次元配列を引数に取る Fortran サブルーチンを C プログラムから呼ぶ方法

プログラムを実行するコンピューターにとっては、 メモリー内にデータがどう並んでいるかだけが問題であるので、 Fortran 言語で書かれたプログラム (をコンパイルして作られたオブジェクト・コード) が 「期待している」順にメモリー上にデータが並ぶように、 C プログラムの側で用意してやればよい。

cmain.c

/* cmain.c */

#include <stdio.h>

#define M 3
#define N 3

void print_(int *row, int *col, double *A);

int main()
{
  int i,j,k,m,n;
  double a[M][N], A[M*N];
  for (i = 0; i < M; i++)
    for (j = 0; j < N; j++)
      a[i][j] = 10 * (i + 1) + (j + 1);
  k = 0;
  for (j = 0; j < N; j++)
    for (i = 0; i < M; i++)
      A[k++] = a[i][j];
  m = M; n = N;
  print_(&m, &n, A);
  return 0;
}
fortransub.f

* fortransub.f
      subroutine print(m,n,a)
      integer m,n
      real*8 a(m,n)
      integer i,j
      do i=1,m
         write(*,*) (a(i,j),j=1,n)
      end do
      end
コンパイル&リンク&実行
oyabun% make candf
gcc -W -Wall -O -I/usr/local/include -c cmain.c
g77 -O -c fortransub.f
g77 -O -o candf cmain.o fortransub.o
oyabun% ./candf
  11.  12.  13.
  21.  22.  23.
  31.  32.  33.
oyabun%

桂田 祐史
2017-10-07