0

いくつかの C/C++ アプリケーションから呼び出される小さな Fortran ライブラリ (新しいコード) に取り組んでいます。ライブラリは、ほとんどすべてのサブルーチンをアプリケーションから個別に呼び出すことができるような種類のものです。そのため、これらのサブルーチンに C インターフェイスを提供する必要があります。

  • それだけでとても快適なモジュールを使用できます。ただし、モジュール名のマングリングを手動でデコードする必要があります (gfortran ではそれほど難しくありませんが、見栄えが悪い) か、bind(C,name="some_name")節を使用します。最後のものは、サブルーチンパラメーターが明示的に相互運用可能にされていないなどのコンパイラー警告につながります (したがって、コンパイラーは、たとえば、に置き換えることdouble precisionを望んでいます)。real(kind=C_DOUBLE)この場合、ライブラリ内のほぼすべての変数をそのような醜い宣言に置き換える必要があります。これにより、コードが読みにくくなります。
  • ライブラリ内のすべてのファイルが複数のサブルーチンで構成されている場合、サブルーチンを使用できます (これが現在私が行っている方法です)。それらの間で明示的にインターフェースが供給されますが、interface ... include "otherfile_h.f90" ... end interfaceこれはあまり快適ではありません。この場合、名前マングリングはかなり単純で、ライブラリのサブルーチンは C から簡単に直接呼び出すことができます。

私が使用するアプローチ (箇条書き 2) では、より多くの入力が必要であり、ソース/ヘッダー ファイルで定義が重複しているため、エラーが発生しやすくなります。スマート C インターフェイスを使用して、ソースを明確で読みやすい状態に保つためのより良い方法はありますか?

4

1 に答える 1

2

Fortran と C を混在させる最新の方法は、Fortran の ISO C バインディングを使用することです。ISO C バインディングは言語標準の一部であるため、これによりコードが移植可能になります。名前マングリングを手動で把握することはコンパイラ固有であり、別のコンパイラでは機能しない可能性があります。「倍精度」は、最新の Fortran のベスト プラクティス宣言とは見なされません (たとえば、拡張倍精度および http://fortranwiki.org/fortran/show/Modernizing+Old+Fortranを参照)。)。現代的な方法は、「real (kind=XYZ)」を使用することです。この言語の概念は、通常、プログラマーが SELECTED_REAL_KIND 組み込み関数を使用して、必要な精度の定数 (MyDouble など) を定義するというものです。必要な精度が C_DOUBLE である場合、その種類の値を使用することは Fortran にとって非常に適切です。これは醜い宣言ではありません。(あなたの箇条書き#2がわかりません。)

于 2012-07-03T13:48:42.183 に答える