2

C で Fortran ライブラリを使用する必要があるプロジェクトに取り組んでいます。Fortran ライブラリには、複素数 * 16、4x4 配列を含む共通ブロックがあります。現在 C では、複素数変数は単純に 2 つの要素を含む構造体であり、complex*16 であるため、要素は long double である必要があります。これは、Fortran で対応する C データ型です。したがって、2 つの long double を持つ構造体があります。

この配列の要素にアクセスします。良いことは、ライブラリの他のすべての共通変数と一緒に、すでにそれを行うことができるということです。問題は、配列からインポートする要素が、

1) 「 C と Fotran の配列構造の違いを考慮しても」本来あるべき順序ではありません。

2) ほとんどの要素は正しいですが、2 つの要素はあるべき姿とは大きく異なります。

3) long double の代わりに double を使用する場合にのみ、正しい要素 (2 つを除く) を取得します。long double (および正しい文字変換) を使用すると、まったく異なるものが得られます。これは、変換の問題を明確に示しています。

私が持っていたすべての説明を使い果たしましたが、何もうまくいきません。C で配列をプライティングするための私のコードは次のとおりです。

for (j=0;j<=3;j++){
    printf("%s", "\n");
    for(k=0;k<=3;k++){            
        printf("%s %d %s %d %s %s %LE %s %LE %s",
          "(", k+1, "," ,j+1, ")", "{",
          (long double)mssmmixing_.neunmx[k][j].dr,
          " ",
          (long double)mssmmixing_.neunmx[k][j].di,
          "}\n");           
    }
}

追加情報: Fortran オブジェクト ファイルを混在させる必要があるため、gfortran を使用して C ファイルをコンパイルしています。代わりに GNU C コンパイラを使用すると、gfortran ルーチンを認識しないというエラーがスローされます。これも問題の原因である可能性があります。gfortran が C の long double を認識しない可能性があります。

どんな助けでも役に立ちます。

4

1 に答える 1

2

Fortran と C を混在させるには、ISO_C_Binding の使用をお勧めします。C 型 long double _Complex と一致する Fortran 型 C_LONG_DOUBLE_COMPLEX もあります。Fortran 言語標準の一部として、これらの型は一致することが保証されています (互換性のあるコンパイラを使用している場合)。C_LONG_DOUBLE_COMPLEX は実際には complex*16 と同じである可能性が非常に高いですが、Fortran では、メモリ レイアウトが異なる場合に備えて 2 つの型の間でコピーを試すことができます。Fortran ソース ファイルは gfortran でコンパイルし、C は gcc でコンパイルする必要があります。gfortran とリンクするのが最も簡単です。(または、他の「ブランド」コンパイラを使用します。)

于 2011-10-31T14:30:07.033 に答える