問題タブ [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 - 小さな C および Fortran プログラムをリンクできない
小さな C プログラムを小さな Fortran プログラムにリンクしたいのですが、リンカ エラーが発生しますundefined reference to fibonacci_array
。
Fortran コード:
C コード:
メイクファイル:
エラーメッセージ:
c - FORTRAN から C に配列を渡すことができません
FORTRAN プログラムから C に一次元配列を渡そうとしています。
C 関数が呼び出されますが、それが保持する値はガベージです。しかし、整数変数を使用して同じ関数を呼び出そうとすると、必要な値を渡すことができます。誰でもこれで私を助けることができますか?
私が使用しているコードはこれに似ています
ファイル: fortran_prog.f
ファイル: c_prog.c
interop - BIND(C, NAME="name") 属性を使用すると、Fortran 関数がエクスポートされないのはなぜですか
次の構文の使用に慣れています
.dll でエクスポートされた関数を生成する
だから今、私はISO_C_BINDING
次のコードで新しいものを試しています
しかし、エクスポート機能は作成されていません
それで、私はここで何が欠けていますか?iso_c_binding
非推奨の!DEC$ ATTRIBUTE DLLEXPORT
宣言を新しいものに置き換えるにはどうすればよいですか?
PS。私は VS2010 を介して Win7-64 プラットフォームで Intel Fortran XE 2013 を使用しています。
c - print ステートメントが gzread の動作を変更するのはなぜですか?
zlib ライブラリの C 関数 gzopen、gzread、および gzclose を使用して、Fortran で gzip ファイルを読み込もうとしています。私のサブルーチンは、print ステートメントが含まれている場合は正常に動作しますが、それがZ_STREAM_ERROR (-2)
ないと a が返されます。これが発生する原因は何ですか?どうすれば修正できますか?
私はCentOSを使用しており、次のものでコンパイルしています:
また、データ ファイルはこのサイトで入手できます。
c - Fortran 派生型内での C 関数へのポインターの保持
C プログラムから呼び出される Fortran DLL があり、プロシージャの 1 つは、C プログラムによって提供されるコールバック関数を定期的に呼び出す必要があります。現在、「単純な」形式でうまく機能していますが、Fortran コード内でより簡単に受け渡しできるように、コールバック ポインターを派生型内に格納できるようにしたいと考えています。これまでのところ、私が試したことは何もないようです。
まず、これが私が現時点で持っているものであり、これはうまくいきます:
C (OK、実際には C++) プログラムで開始すると、コールバックのヘッダー プロトタイプは次のようになります。
Fortran 呼び出しのプロトタイプは次のとおりです。
実際のコールバック関数は次のとおりです。
C++ からの Fortran コードへの呼び出しは次のとおりです。
ここm_image
で、現在のオブジェクトのメンバー属性である画像データの配列です。C++ が生の画像データを Fortran DLL に渡し、Fortran にそれを処理するように要求します。これには長い時間がかかるため、Fortran は定期的に画像バッファーを更新し、コールバックを呼び出して GUI を更新します。とにかく、Fortran 側に移り、C コールバックのインターフェイスを定義します。
メインの Fortran ルーチンを次のように定義します。
メインルーチンのどこかで、サブルーチンを呼び出しますfoo
:
...ここfoo
で、次のように定義されます。
私が言ったように、これはすべてうまく機能し、長い間そうしてきました.
今、私が試したがうまくいかないことについて:
引数を構造体のフィールドにコピーするだけの素朴なアプローチ
私がしているのは、元の要素を変更せずに構造にコピーすることだけなので、これが機能することを期待しています。C 側でも、主要な Fortran 関数の定義でも、 への抽象インターフェイスでも、何も変更されていませんc_callback
。新しい Fortran 派生型を作成するだけです。
次に、メイン関数で、C アプリケーションから受け取った値を入力します。
サブルーチン foo が少し変更され、構造内でコールバックと C オブジェクトを検索するようになりました。
これは、「アクセス違反読み取り場所 0xffffffffffffffff」の呼び出しで失敗します。
より多くの iso_c_binding 機能を使用した洗練されたアプローチ
C 側では何も変更しませんが、メイン関数の Fortran 側を次のようにコールバックを受け取るように変更しますc_funptr
。
抽象インターフェイスをsubroutine c_callback
前と同じように定義しますが、その部分を残したりbind(c)
、省略したりして実験しました。サブルーチンを呼び出すメイン関数内のコードは次のfoo
とおりです。
...サブルーチン foo 自体は、前の例のように定義されたままです。
残念ながら、これは前の例とまったく同じように失敗します。
ここで達成しようとしていることを達成するための正しい構文があると思います。アドバイスをいただければ幸いです。
macos - OS X 10.8 で gfortran を使用した関数ポインタの不正なテキスト再配置
Xcode 5.0.2 と gfortran 4.8.2 を自作でインストールした OS X 10.8 システムで、次のエラー メッセージが表示されます。
f03_iso_c.f03 の内容は、
このエラーを解決するための助けをいただければ幸いです。