6

私はいくつかの fortran-calling-C コードに取り組んでおり、iso_c_binding モジュールの使用について不明です。

私は fortran と C のインターフェイスを iso_c_bindingなしで正常に動作させています。問題は、関数と変数を明示的にバインドする必要があるかどうかです。たとえば、これは機能します:

program testprog
...
interface
  subroutine c_parser(param)
    integer, intent(in) :: param
  end subroutine
end interface

integer :: a
call c_parser(a)
..
end program

/****************/

void c_parser_ (int* param)

したがって、C 関数にアンダースコアを追加し、その関数へのインターフェイスを記述して、それを fortran プログラムから呼び出します。私はポインターや割り当て可能変数を使用しません。すべてのコードには、fortran サブルーチンから C に移動する必要がある int、char、float、logical があります。

iso_c_binding の正確な目的は何ですか? 落とし穴はありますか?例として、これはバインディングを介して文字列を使用する場合の警告に言及しています (「残念ながら、少なくとも GNU および Intel コンパイラでは、ステートメント」の部分を参照してください)。

4

2 に答える 2

12

問題の「作業」アプローチは、本質的に Fortran プロセッサ固有のものです。これは、歴史的な慣習により、一部のオペレーティング システムでは一般的な配置ですが、決してどこにでもあるわけではありません。コンパイラファミリ内では、呼び出し規約の側面はコンパイルオプションによって異なり、そのアプローチを破る可能性がある方法でコンパイラのバージョンによって異なります。

ISO_C_BINDING は、いくつかの定数、いくつかの型、およびいくつかのプロシージャを提供する単なるモジュールです。これはたまたま、標準によって指定され、コンパイラ ベンダーによって提供されるもの (組み込みモジュール) ですが、それ以外の場合は特別な機能はありません。

これらの定数、型、およびプロシージャーはすべて、Fortran プログラマーが移植可能な方法で、対応する C と互換性のあるデータ オブジェクト、データ ポインター、およびプロシージャー ポインターを作成するのに役立ちます。一部の型と手続きは特殊です。つまり、プログラマーが独自の Fortran コードを記述してそれらを作成できるとは限りません。

C の相互運用性には、組み込みモジュールの使用以上のものがあります。スコープの先頭に USE ISO_C_BINDING を配置しても、それ自体では何も変更されず、特定の識別子がアクセス可能になることはありません。

BIND(C) 属性は、C と Fortran の間で相互運用する必要がある変数、派生型、共通ブロック、およびプロシージャに適用する必要があります場合によっては、この属性は Thing のバインディング名 (C 名) も指定します。派生型と共通の場合、これによりコンポーネントの配置と順序が変更される可能性がありますが、プロシージャの場合、プロシージャの呼び出し規則の側面が変更される可能性があります。

また、相互運用可能なデータ オブジェクトとプロシージャの性質に関して、プログラマが従わなければならない一連の要件もあります。

(リンクされた fortran wiki ページの「残念ながら...」コメントは、文字配列への代入が Fortran でどのように機能するかについての誤解のようです - C の相互運用性自体とは何の関係もありません。 C char 配列と相互運用可能な Fortran の 1 文字配列。)

特定のプロジェクトのターゲット コンパイラ スイートが Fortran 2003 の必要な部分をサポートしている場合、Fortran 2003 の C 相互運用性機能を使用しない正当な理由はないと思います。結果として得られるコードの堅牢性と移植性の向上この機能の使用は説得力があります。

于 2013-10-22T19:58:53.730 に答える