Myページ
ホーム
コミュニティの人々
ソフトウェア
技術紹介
適用分野
Tyzohとは
ご意見お問い合わせ

kkatoのブログ

C言語からfortranの2次元配列への参照

C言語からfortranを呼び出すためのメモ。

普通の変数は参照渡しだからCではポインタになる、とかという点はいいのだが、2次元配列の渡しかたが難しい。

一般的な配列とparameterでは並び順が違うようなので気をつけなければならない。

以下サンプルコード:

a.f:


      module test
      integer i,j
      integer s
      integer,parameter:: param(2,5)= (/ 0,1,2,3,4,5,6,7,8,9 /)
      end module test
      use test
      integer a(2,5)
      integer b(2,5)
      s=0;
      do i=1,2
         do j=1,5
            a(i,j)=s
            s=s+10
         end do
      end do
      call f(a,b)
      do i=1,2
         do j=1,5
            write(*,*) 'b(',i,',',j,') = ',b(i,j)
         end do
      end do
      end


f.c:

#include <stdio.h>

extern test_mp_param_[][5];

void f_(int a[][2], int b[][2])
{
  int i,j;
  for (i=0; i<5; i++) {
    for (j=0; j<2; j++) {
      printf("a[%d][%d] = %d\n",i,j,a[i][j]);
      b[i][j] = a[i][j] + test_mp_param_[j][i];
    }
  }
  
}


a[i][j]とtest_mp_param_[j][i]で添字が逆になっている点に注意。
これのa.fとf.cをコンパイルしてリンクして実行する。ちなみにテストはgccとifortでやった。
以下実行結果:


a[0][0] = 0
a[0][1] = 50
a[1][0] = 10
a[1][1] = 60
a[2][0] = 20
a[2][1] = 70
a[3][0] = 30
a[3][1] = 80
a[4][0] = 40
a[4][1] = 90
 b(           1 ,           1 ) =            0
 b(           1 ,           2 ) =           11
 b(           1 ,           3 ) =           22
 b(           1 ,           4 ) =           33
 b(           1 ,           5 ) =           44
 b(           2 ,           1 ) =           55
 b(           2 ,           2 ) =           66
 b(           2 ,           3 ) =           77
 b(           2 ,           4 ) =           88
 b(           2 ,           5 ) =           99


この仕様、かなり気持ち悪いのだがなんとかならないものか。
おそらく歴史的事情やなにやらがあるんだろうが。

kkato (2009-02-23 15:10) | コメント(0)| トラックバック(0)

トラックバック(0)

トラックバックURL:

コメント

コメントを投稿

名前

電子メール

URL

ログイン情報を記憶

コメント (スタイル用のHTMLタグを使うことができます)

プロフィール

kkato

・10年以上前からのdebian使いです。
・C++, Ruby, perl, ocamlなどの言語をよく使います。
・数値計算などが得意です。
・スパムメールの文面をよく読むのが好きです。
ホームページ:
http://sites.google.com/site/kimikazu/

カテゴリ

RSSフィード

コミュニティの人々 | ソフトウェア | 技術紹介 | 適用分野 | Tyzohとは | ご意見お問い合わせ

Copyright (C) 2004-2011 Nihon Unisys, Ltd. All Rights Reserved.
Powered by Movable Type Open Source