問題タブ [fortran-iso-c-binding]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - Fortran から C に割り当て可能な配列を渡し、それを malloc する
Fortran ライブラリ コードの一部を C に変換して、最終的に Fortran ラッパーを使用した C 関数を作成しています。Fortran 95 を使用しています。
割り付け可能な配列を処理するための推奨される方法は何ですか?
割付け配列を C 関数に渡して、C 関数内で malloc することはできますか? (C 関数は、malloc されるサイズを認識しています)
Fortran プログラムで、C 関数で割り当てられたものを解放できますか? そのため、最後にクライアントの Fortran アプリケーションが配列の割り当てを解除するか、メモリを解放する C 関数を呼び出す必要があります。
小さな例またはそのリンクをいただければ幸いです。
c++ - C++ と Fortran の混合リンクの問題
オンラインで検索しましたが、単純な C++ および Fortran コードを Linux からコンパイルする方法がわかりません。複雑にする必要がありますが、単純な例から始める方法を知る必要があるだけです。
私のC++コードはこれです:
私のFortranコードはこれです:
ifort
Fortran コードと g++ を C++ コード用にコンパイルするために使用しています。この端末コマンドを試しました:
しかし、「リンクが行われていないため、リンカー入力ファイルは使用されていません」というエラーが表示されます。2つをリンクする方法がわかりません。誰かが私を助けてくれれば、とても感謝しています!
PS - コンパイル行の最後に追加しようとし-lg2c
ましたが、認識されません。
c - cでfortranモジュールサブルーチンを使用する方法
Cでfortranモジュールサブルーチンを使用しようとしていますが、うまくいきません。これは私の問題の簡略化されたバージョンです:
サブルーチンを含む 1 つの fortran モジュールがあり、2 番目のサブルーチンがそのモジュールを使用しています。
sb
今、私はcで関数を呼び出したい:
それらをどのようにリンクすればよいですか?
私は次のようなものを試しました
しかし、それはエラーを与えます
sb.o: 関数
sq': sb.f90:(.text+0x6): undefined reference to
内 add1' /tmp/icc40D9n7.o: 関数内main': main.cpp:(.text+0x2e): undefined reference to
sb'
問題を解決する方法を知っている人はいますか?
compiler-errors - コンパイル エラー: "_for_stop_core" が見つかりません
fortran サブルーチンを呼び出す ac コードをコンパイルしようとしていますが、常にエラーが発生します。
Fortran コードは次のとおりです。
そしてここにcコードがあります
それらをコンパイルすると
エラーが発生します
そして、それらをコンパイルすると
エラーが発生します
では、なぜこれらのエラーが発生し、どのように解決すればよいのでしょうか?
IBMコンパイラには、Cコンパイラにfortranライブラリをリンクするように指示するオプション「-lxlf90」があることを知っています。これにより、「_for_stop_core」エラーが解決されます。intel c コンパイラに同様のオプションはありますか?
c - ISO_C_BINDING の理由
私はいくつかの fortran-calling-C コードに取り組んでおり、iso_c_binding モジュールの使用について不明です。
私は fortran と C のインターフェイスを iso_c_bindingなしで正常に動作させています。問題は、関数と変数を明示的にバインドする必要があるかどうかです。たとえば、これは機能します:
したがって、C 関数にアンダースコアを追加し、その関数へのインターフェイスを記述して、それを fortran プログラムから呼び出します。私はポインターや割り当て可能変数を使用しません。すべてのコードには、fortran サブルーチンから C に移動する必要がある int、char、float、logical があります。
iso_c_binding の正確な目的は何ですか? 落とし穴はありますか?例として、これはバインディングを介して文字列を使用する場合の警告に言及しています (「残念ながら、少なくとも GNU および Intel コンパイラでは、ステートメント」の部分を参照してください)。
c++ - C++ からの Fortran STOP のインターセプト
レガシー Fortran ライブラリへの C++ インターフェイスを用意しました。
レガシー ライブラリの一部のサブルーチンは、醜いが使用可能なステータス コード規則に従ってエラーを報告します。私はそのようなステータス コードを使用して、C++ コードから読み取り可能な例外をスローします。うまく機能します。
一方で、レガシー ライブラリがSTOP
(プログラムを終了させる) 呼び出しを行う場合があります。そして、状態が回復可能であっても、それを行うことがよくあります。
これを C++ 内からキャプチャしたいのですが、これまでのところ成功していません。STOP
次のコードは単純ですが、当面の問題を正確に表しています。
Fortran レガシー ライブラリfmodule.f90
:
C++ インターフェイスmain.cpp
:
コンパイル行 (GCC 4.8.1 / OS X 10.7.4;$
コマンドプロンプトを示します):
実行:
どうすればその番号をキャプチャしてSTOP
、別の番号をリクエストできるでしょうか。Fortran コードには触れたくないことに注意してください。
私が試したこと:
std::atexit
: 一度入力すると「戻る」ことはできませんstd::signal
:STOP
キャプチャできるシグナルをスローしていないようです
c - C 可変個引数関数と Fortran の相互運用性
C 可変引数関数を宣言して Fortran から呼び出す方法はありますか? この関数を呼び出して、文字列でラベル付けされたベクトル間の内積を計算する必要があります。私の考えは、引数の変数リストに文字列リテラルが含まれている次のようなものを宣言することでした。引数の変数リストが空の場合、標準ラベルを検索して計算を実行します。ユーザーが 2 つのラベルを指定した場合、それらの 2 つのベクトルを取得して内積を取得します。
唯一の問題は、C ライブラリをコンパイルして Fortran 実行可能ファイルにリンクできることですが、引数の変数リストにアクセスしようとすると実行時エラーが発生します。私がやろうとしていることは可能ですか?考えられる解決策は、2 つの関数に分割することです。1 つは標準のラベル検索 (引数が 0 の場合) を行い、もう 1 つは非標準のラベル検索 (引数が 2 つの場合) を処理します。ただし、このソリューションは避けたいと思います。
c - ISO_C_BINDING と OpenMP の問題
OpenMP を使用して並列化された Fortran プログラムがあります。main 関数は、常微分方程式を含む系の定義を含む Fortran 関数を呼び出します。これは、異なるスレッドに分割されている場合に問題なく実行されます。また、ODE の同様の定義を持つ C ファイルにリンクするオプションも必要です。OpenMP を使用しない場合でも、これを実行できます。OpenMP を使用すると、ODE が正しく計算されません。