4

C関数からfortran関数を呼び出す方法について教えてください。これらの C 関数は、cython を介して Python コードで使用されます。まとめると、次のスキームがあります。

Cython モジュール -> C 関数 -> Fortran、ここで -> は「呼び出し」を意味します。

現在、cython から C 関数を呼び出すことはできましたが、fortran 関数を呼び出すのに苦労しています。助けてもらえますか? (簡単な例でいいでしょう)。

前もって感謝します。編集: gcc 4.1.2 を使用しています。そしてグフォルトラン

4

3 に答える 3

7

最初の回答のリンクは、古い方法について説明しています。Fortran への ISO C バインディングの追加により、C から Fortran を呼び出すこと、または Fortran から C を呼び出すことがはるかに簡単になりました。この Fortran 言語機能を使用すると、C とバイナリ互換性のある実行可能コードを生成するように Fortran コンパイラに指示されます。プログラマは接続を「ハック」する必要はありません。接続は言語の一部であるため、コンパイラとプラットフォームに依存しません。技術的には、ISO C Binding は Fortran 2003 の一部ですが、バージョン 4.3 以降の gfortran や Intel ifort など、多数のコンパイラで数年間利用できます。

Fortran サブルーチンまたは関数を C から呼び出すには、Fortran サブルーチンまたは関数を bind C オプションで宣言し、バインディングで提供される C 互換の型を引数の宣言に使用します。gfortran マニュアルの「Mixed Language Programming」の下に例があります。ISO C バインディングは言語の一部であるため、マニュアルのこのセクションはほとんどコンパイラに依存しません。ここの Stack Overflow や Web 上の他の場所の以前の回答には、他の例があります。

以下は、C から呼び出されるサブルーチンの Fortran サブルーチン宣言の簡単なコード フラグメント (未テスト) です。

subroutine test ( varint1, varflt2 )  bind ( C, name="MyTest" )

   use iso_c_binding

   integer (kind=c_int32_t), intent (in) :: varint1
   real (kind=c_float), intent (out) :: varflt2

バインド C 名 "MyTest" は Fortran 名をオーバーライドします。Fortran とは異なり、大文字と小文字が区別されます。アンダースコアを気にする必要はありません。変数の型は明らかなはずです...利用可能なものについては、gfortranのマニュアルまたは他の場所を参照してください。

于 2010-12-08T03:30:15.257 に答える
1

Fortran ルーチンへの C、cython、および python バインディングを生成する fwrap と呼ばれる自動化ツールがあります。まだベータ版の状態だと思いますが、参考になるかもしれません。リンクはこちらです。

于 2010-12-13T09:42:14.340 に答える