1

私は理論物理学の研究生で、宇宙論に取り組んでいます。私の研究の過程で、私は Fortran コードのかなり巨大なライブラリを使用しており、プログラミングのニーズに C を使用しました。

多数のテスト ファイルで 2 つのプログラムをリンクすることができましたが、見事に動作します。しかし、私はそれらすべてをリンクするためにオブジェクト ファイルを使用してきました。しかし、C で実際に実行しようとすると、Fortran ヘッダー ファイルへの参照が含まれます。それらは互いにうまく統合して呼び出しているように見えますが、Fortran ヘッダー ファイルの形式は C コンパイラと互換性がないため、ヘッダー ファイルにジャンプすると、構文を理解できないというエラーがスローされ始めます。

たとえば、Fortran ヘッダー ファイルは、real*8 の double 変数を定義しているため、C がそれらを読み取ると、エラーがスローされます。ファイル内のコメントでも同じことが起こります。

それで、この問題を解決する方法はありますか?つまり、Fortran 形式のヘッダー ファイルを C で読み込めるようにします。

インターネットを調べたところ、紛らわしい答えが見つかりました。どちらに従うべきかわかりません。この問題の助けをいただければ幸いです:)

4

2 に答える 2

7

申し訳ありませんが、あなたは非常に混乱しています。Fortran ヘッダー ファイルとは何ですか? たとえば、C コンパイラを使用して Fortran インクルード ファイルを読み取ることはできません。2つの言語は違いすぎます。さらに、Fortran のインクルード ファイルが、C のファイルに匹敵するヘッダー ファイルになることはほとんどありません。

使用しているコンパイラの種類がわかりません。しかし、最近の GCC バージョン (Gnu Compiler Collection) を選択した場合、内部に含まれる Fortran コンパイラは、Fortran-C の結合を容易にする ISO_C_BINDING 機能を考慮することができます。

例 :

MODULE my_fortran
  USE iso_c_binding
  IMPLICIT NONE
  CONTAINS
  SUBROUTINE my_subroutine(a,b) BIND(C,name="my_sub")
    INTEGER(c_int),INTENT(in),VALUE :: a
    REAL(C_DOUBLE),INTENT(out) :: b
    ...
  END SUBROUTINE
END MODULE

たとえば、「my_sub.h」という名前の C ヘッダー ファイル:

void my_sub(int, double *);

Cファイル

#include "my_sub.h"

int main(){
  double b;
  int a=3;
  my_sub(a,&b);
  ...
}
于 2011-10-12T18:10:24.193 に答える
4

Fortranは通常、その変数を参照によって渡します(ポインターを渡します)。つまり、呼び出し元のCプログラムでアドレスを指定する必要があります。

関数の結果は、値で渡すことができます。たとえば、次のコードは「ガンマ」と呼ばれるFORTRAN関数を呼び出します。

double   x, y;
   ..................
   x = 2.0; 
   y = gamma_(&x) 

呼び出し側プログラムの変数のサイズがFortranルーチンのサイズと同じであることを確認してください。

float  --- REAL     (this is typical, but not always the case)
double --- REAL*8

Fortran関数は、C呼び出し関数の先頭で宣言する必要があります。

extern void read_(int *small, float *medium, double *large);

すべての変数をポインターとしてFortranに渡す必要があることに注意してください。関数名はFortranでは大文字と小文字を区別しませんが、C宣言でアンダースコアを取得し、呼び出されると次のようになります。

 read_(&small, &medium, &large);

Fortran関数は、次のように変数を受け取ります。

SUBROUTINE READ(small,medium,large)

  INTEGER       small
  REAL          medium
  DOUBLE        large

これらの変数の正確なサイズはシステムのアーキテクチャ(32ビットと64ビット)によって異なるため、システムのCとFortranでのint、float、doubleの対応を確認する必要があります。

于 2011-10-12T17:10:58.960 に答える