問題タブ [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 - Makefile の変更による FORTRAN と C のクラビング
C ルーチンを呼び出してメジャーを計算する FORTRAN コードがあります。FORTRAN コードは次のとおりです。
c 関数は次のようになります。
c と fortran をクラブ化するには、makefile に Makefil.lib を含める必要があります。私はそうし、次のようにメイクファイルを準備しました。
しかし、それを作成すると、次のメッセージが表示されます。
このエラーが発生する理由を教えてください。どうもありがとう。
c - Cで(動的に割り当てられた)Fortran配列にアクセスする方法
私の主な質問は、なぜ配列がそのような奇妙なことをするのか、そして「クリーンな」方法で次のことを行う方法があるかどうかです。
私は現在、おおよそ以下のコードのように、foo.c
FortranプログラムとインターフェースするCプログラムを持っていbar.f90
ます。dlopen/dlsym
foo.c:
bar.f90:
主な利回りを実行します
これは、Fortranが配列を正しく割り当て、指定された値を正しく格納していることを示していますが、dlsymを介してアクセスできなくなりました(そのデータで作業するとsegfaultが発生します)。固定サイズの配列でもこれを試しましたが、結果は同じです。
誰かがこの行動の理由を知っていますか?個人的には、双方向で動作するか、まったく動作しないことを期待していました。この「FortranはC配列を受け入れますが、その逆はありません」ということで、この方法でCから配列にアクセスする際に基本的な間違いがあったのではないかと思います。
もう1つの(そしてさらに重要な)質問は、これらの「正しい方法」のような配列アクセスをどのように行うかです。現在、「Fortran as .so」インターフェースに固執することが良い方法であるかどうかさえわかりません。この場合、混合プログラミングを試みることも可能だと思います。それにもかかわらず、配列の問題は残っています-これはISO Cバインディングを使用して何らかの方法で解決できることを読みましたが、まだその方法を理解できませんでした(Fortranではあまり作業していませんが、特に上記のバインディングでは作業していません) 、この問題についてのヘルプをいただければ幸いです。
編集:
さて、私はISO Cバインディングをもう少し読んで、ここで非常に便利なアプローチを見つけました。を使用C_LOC
すると、Fortran構造体へのCポインターを取得できます。残念ながら、配列へのポインタはポインタへのポインタのようであり、C配列として扱う前に、Cコードで逆参照する必要があります。
編集:
少なくとも大部分は、ウラジミールFが指摘したように、Cバインディングを使用してプログラムを動作させることができました。CファイルとFortranファイルがリンクされたので、少なくともFortranの部分ではlibdlインターフェイスを回避できます。動的Cライブラリをロードし、そこにあるシンボルの1つへの関数ポインターを取得して、それを渡す必要があります。後で計算の一部としてその関数を呼び出すFortranへの関数ポインターとして。上記の関数はdouble*s [arrays]を期待しているので、奇妙なことに、C_LOCを使用してFortran配列を渡すことができませんでした。C_LOC(array)
またC_LOC(array(1))
、正しいポインターをC関数に戻すこともできませんでした。array(1)
しかし、トリックをしました。悲しいことに、これはこれを行うための「最もクリーンな」方法ではありません。誰かが私にこれを使用してこれを行う方法のヒントを得た場合C_LOC
機能、それは素晴らしいでしょう。それにもかかわらず、私はそれがより安全な解決策であると考えるので、ウラジミールFの答えを受け入れます。
c - コンパイル時に iso_c_binding が利用可能であることを確認してください
混合 C/Fortran アプリケーションのコンテキスト内で、前処理ディレクティブのように、コンパイラが「iso_c_binding」を認識していることを確認する方法はありますか (たとえば、GCC 4.1.2 は認識していませんが、4.3.4 は認識しています)。か何か?他のコンパイラを使用する可能性があるため、GCC のバージョンを単純に確認する余裕はありません。
ありがとう
c - void から MPI_Aint への変換
いくつかの変数を void* から MPI_Aint に変換するのに問題があります。コードの一部を次に示します。
mmap は機能していますが、エラーが発生しています (最後の行をコメントしてもエラーはありません)
役立つアイデアはありますか?以下は、完全な C 関数コードです。
c++ - C++ と Fortran コードの間で複素数配列を渡す
私は C++ と Fortran コードの両方を扱っています。C++ コードは、Fortran サブルーチンを呼び出す必要があります。Fortran サブルーチンの 1 つのパラメーターが Fortran 型complex
です。
C++ コードは 1 つのファイルにあり、Fortran コード サブルーチンは別のファイルにあります。私は64 ビットシステムgcc
で andを使用しています。gfortran
GNU/Linux
以下は、Fortran サブルーチン宣言 (およびいくつかの追加行) を示すスニペットです。
C++ ファイルでは、Fortran コードに渡される引数は、値ではなく参照によって渡す必要があることを理解しています。extern
Fortran サブルーチンは、キーワードを使用して C++ コード (ソース コード ファイルの先頭) で関数として宣言されます。
ただし、関数の最後のパラメーターは複雑な C 配列です。どうすれば次のことが可能になるでしょうか:
phi
引数として渡される C/C++ の複雑な配列にメモリを割り当てますか?- Fortran コードでメモリを使用できるように、配列を引数として Fortran サブルーチンに渡しますか?
c - fortranからCポインターにアクセスするにはどうすればよいですか?
私はこのようにステータス配列に値を割り当てました:
status [i] + = 1;
そして、Fortranからこのアレイにアクセスするの
が好きです。どうすればこのアレイにアクセスできますか?
たとえば、次のようにSTATの値をFortranから変更したいと思います。
STAT(2)= 3
これは可能ですか?
cソース
fortranソース
私はこのコードをテストし、この質問に対する良い答えを参照しました。しかし、このようにしようとすると、セグメンテーション違反エラーが発生しました:
問題が何であるかを認識できますか?
c - c-Fortranの相互運用性-ポインターを持つ派生型
私はPythonから使用可能にする必要がある長いFortranコードを持っています。私はFortran->C->Pythonインターフェースを実行することにしました。
問題が発生しました:Fortranモジュール内に次のような派生型があります
メンバーとして入力します。
ifortでコンパイルしようとすると、(gfortranで似たようなものが)得られます:
これは、実際にはIntelコンパイラのドキュメントおよびFortran2003標準のポイント15.2.5と一致しています。
内部に割り当て可能またはポインタを使用してFortranの「タイプ」にアクセスする方法はありますか?
c - 配列引数を使用して Fortran からスカラー C 関数を呼び出すことはできますか?
最近、C コードの便利なスニペットのために、Fortran から C 関数を呼び出したいという状況に遭遇しました。配列操作の便宜上、この関数を配列引数でも呼び出せるようにしたかったのですが、スカラー引数しか受け入れられませんでした。
Fortran では、もちろん、elemental
これを実現するために単純に手続きを宣言できます。また、C 手続きへのインターフェイスをbind(C)
. ただし、C には要素手続きの概念がないため、Fortran (2008) 標準はこの組み合わせを除外しています。
C1246 要素手続きは BIND 属性を持ってはならない.
では、この機能は Fortran で実現できますか?
c++ - C と Fortran の両方から Fortran に文字列の配列を渡す方法は?
文字列の配列を C から Fortran サブルーチンに、また Fortran から同じ Fortran サブルーチンに渡そうとしています。C と Fortran の両方から、単一の文字列 (つまり、1D 文字配列) を正常に渡すことができました。ただし、文字列の配列に問題があります。私は Fortran 側で ISO C バインディングを使用しています。理想的には、これを呼び出し側で可能な限りシームレスにしたいと考えています。
関連する質問と回答をいくつか読みました。いくつか (つまり、これとこれ) は、詳細がなく、単に「ISO C を使用する」だけであり、あまり役に立ちません。この回答は非常に役に立ちました (別の質問に対する同様の回答) が、c_null_char が単一の Fortran 文字列で認識されるように見える単一の文字列に対してのみ機能します。2 つの別個のルーチンがなければ、配列の場合に何をすべきかわかりません。
私が現在持っているのは、文字列の配列 ( string
)を渡したい C ルーチンです。
そして、同様の Fortran ルーチン:
これまでのところ、これは私が受信側のために持っているものです:
これは C 関数で機能します。私はこの出力を得ます:
ただし、Fortran を使用して行うと、ナンセンスになります。
c_null_char
このアプローチにはないようです。
では、C と Fortran の両方から文字列の配列を取り込む Fortran サブルーチンを作成するにはどうすればよいでしょうか?
c - C+Fortran なぜ sigsegv なのですか?
Fortran と C の「マスター」を使用した次のコードがあります。sigsegv が表示されますが、その理由がわかりません。マスター C プログラムからポインターを取得し、それを Fortran ポインター形式に変換し、C ポインターが指していたデータを読み取ることになっています。特別なことは何もありませんが、それでも SigSegv です。これは、Fortran多次元配列との相互運用性の欠如を回避する唯一の方法です...(そう、Cには多次元配列がありません)。
Fortran の部分:
C パート:
SIGSEGV はprint *,i,j,a(i,j)
、Fortran 部分の行で発生します。
編集:「整数* 8」を「整数」にdo i=1,10
戻し、に戻しましたdo i=1,5
。このバージョンでは、質問はまだ有効です
SIGSEGV は i=1、j=1 の場合に表示されます