問題タブ [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.

0 投票する
2 に答える
340 参照

c - CからFortran関数を呼び出すときのEXC_BAD_ACCESS

私は周りを見回しましたが、EXC_BAD_ACCESSの問題はたくさんありますが、どれも役に立ちませんでした。

Mountain Lion(OSX 10.8だと思いますか?)とPGI12を使用しています。

CからFortran関数を呼び出すことができないようです。簡略化されたケースを作成しましたが、整数を渡すことができないようです。

私のFortran関数は次のとおりです。

そして私のC関数は、

それを構築します。

(警告が私の問題の原因ではないことを願っています。PGIユーザーフォーラムは、新しいバージョンのファイルを送信すると言ってこれに応答しますが、まだ返信されていません。PGIがなぜそうする必要があるのか​​わかりません。指定する多くの追加ライブラリ)

デバッガーで実行すると。

私は完全に迷子になっていますが、なぜintを送信できないのですか?整数に値を割り当てて送信しようとしましたが、サイコロはありません。サブルーチンとして試しましたが、戻り値なしで試しました。何も機能しません。

0 投票する
1 に答える
2105 参照

eclipse - Eclipse で混合プログラミング言語 (C と FORTRAN) を作成してコンパイルする方法

基本的には、Ubuntu(Linux 環境) の Eclipse(Parallel Application Development) IDE で、C と FORTRAN を使用して混合プログラミング言語を書きたいと考えていました。

私のメイン プログラムは C で、関数の呼び出しは FORTRAN でした。では、この FORTRAN ソース プログラムを C プロジェクトにどのようにリンクすればよいでしょうか。

問題なく、ターミナル(Linux)から同じ(混合プログラミング)を作成してコンパイルすることができました。

0 投票する
2 に答える
2358 参照

c++ - C 関数名が最初に C から渡された Fortran からの C 関数の呼び出し

関係のない理由で、C/C++ 関数名を Fortran サブルーチンに渡す必要があります。Fortran サブルーチンは、その C 関数を呼び出します。私が見つけたのは、関数名を Fortran サブルーチンにうまく渡すことができるということです。そのサブルーチンで、正しい C 関数を呼び出すことができます。ただし、C 関数の引数はこの呼び出しで壊れます (C から直接呼び出された場合は問題なく動作します)。ISO C バインディングを使用して、これを機能させようとしましたが、役に立ちませんでした。

MWE は次のとおりです。

fortranRoutine.h:


呼び出されたFortran.h:


main.cpp:


fortranRoutine.f90:


呼び出されたFortran.cpp:


現在の結果

これを実行すると、現在次のようになります。

calledfromFortranfromへの最初の呼び出しはmain正しく機能しfortranRoutineますが、値から呼び出されると壊れます。実行するたびに、後者の値が変化することに注意してください。私は何を間違っていますか?

0 投票する
1 に答える
337 参照

python - Cpython と fortran の連結リスト間の相互運用性

おおよそのようなfortranリンクリストがあります

理想的には、Cpython を使用してこれと対話したいと考えています。共有オブジェクトを作成するために f2py プログラムを使用して、Python で fortran サブルーチンを頻繁に使用しました。ただし、f2py は派生型では使用できません。

私の質問は、cpython を使用して Fortran のリンク リストのようなものにアクセスできるかどうかということです。fortran から c から cpython へのルートに従う必要があると思います。ただし、Fortran 派生型を c と相互運用できるようにするには、「各コンポーネントには相互運用可能な型と型パラメーターが必要であり、ポインターであってはならず、割り当て可能であってはなりません」と読みました。同様に、ポストc-fortran 相互運用性 - ポインターを持つ派生型は、これを確認しているようです。

cpythonからfortranのリンクリストにアクセスすることが絶対に不可能かどうかを誰かが知っているかどうか疑問に思っていました. できれば、間接的でも遠回りでもいいので、詳しく教えていただけるとありがたいです。

ありがとう、マーク

0 投票する
2 に答える
447 参照

fortran - コンパイルされたオブジェクトに Fortran の「パラメータ」タイプが含まれていません

属性を持つ変数と属性を持つ変数を含む Fortran モジュールがparameterありますsave。それらparameterはコンパイルされたオブジェクトに含まれていないため、ライブラリをアセンブルしようとすると問題になります。たとえば、ファイルを考えてみましょうtestModule.f90:

これを次のようにコンパイルします: ifort -c testModule.f90. 中身を確認すると:

thisIsSaved変数のみが存在します。ではなく変更できるthisIsParameteredことはわかっていますが、理想的には、リンクしているユーザーがこの値を変更できないようにしたいと考えています。これを行う方法はありますか?saveparameter

編集: Fortran だけでなく、C コードからもこのライブラリにアクセスできるようにしたいと思います。

0 投票する
2 に答える
2415 参照

fortran - fortranプログラムでMETIS API(C言語で書かれたもの)を呼び出す

2 週間以上、C で書かれたMETISライブラリの 1 つを自分の fortran コードから呼び出すのに苦労しました。残念ながら、あなたの助けがなければ HAPPY END にはなりません。直接呼び出しインターフェイスの使用に関する投稿をいくつか見つけました。デバッグのために変数を監視できるので、私は後者を好みます。私が添付した3つのコードがあります。

1. 使いたいc関数
2. fortranインターフェースモジュール
3. fortranプログラム

(1)c関数

c 関数本体を削除しました。私の問題を理解する必要はない

ここで、idx_tは整数で、 real_tは単精度または倍精度です。neからoptionsまでが入力され、最後の 3 つの引数が出力されます。そしてvwgtvsizetpwgtsoptionsはデフォルト設定の入力として null を受け取ることができます 私はこのような c 関数を使用するためのインターフェース モジュールを書きました

(2) Fortran インターフェースモジュール

修理済み!

  1. use 定数の下にuse iso_c_bindを挿入します。
  2. nenn、およびその他の変数には、 integerの代わりにinteger(c_int)を使用します。
  3. 未使用のモジュール定数を削除する

.

そして、これが関数を呼び出す私のプログラムコードです

(3) Fortran プログラム

修理済み!

  1. npartの割り当てサイズは固定です。じゃなくて
  2. epart、npart の Fortran スタイルの配列を取得するために opts(7)=1 が追加されました (今のところ影響はありません)。

.

ただ、tpwgtにnullを入れても以下のようなエラーメッセージが出てしまうのが難点です。

入力エラー: 制約 0 の tpwgts の合計 0.000000 が正しくありません。

そして、このメッセージは以下のコードで処理されます。

とにかく、null の代わりに tpwgts の配列を配置した場合に何が得られるかを確認するために、tpwgts(:) = 1.0/npartsを実行すると、tpwgts の合計が 1.0 になります。しかし、合計が1.75という同じメッセージが表示されました。

これらは私の質問
です 1. 引数を正しく渡すために null() を使用しましたか?
2. すべての引数のポインターを c 関数に渡す必要がありますか? ではどうやって?
3. opts(0:39) に整数を入れるだけで十分ですか? たとえば、 「インターフェイス モジュール」のない投稿では、 options(3)=1 のような単純なコードが使用されます。しかし、C コードでは、options には options[METIS_OPTION_NUMBERING]、options[METIS_OPTION_UFACTOR] のように 16 個の名前付き変数があります。オプションを設定するには何か必要だと思いますが、わかりません。4. fortran での METIS の例はありますか?

どんな種類のヒント/アドバイスも私にとって大きな助けになります。ありがとうございました。

結論

私が抱えていた問題は、c 関数がfortran コードからヌル ポインターを認識できないことでした。

インターフェースモジュールで変数の宣言ミスがいくつかありました (「修正済み」とコメントを参照)

コードは正常に動作しているようです。しかし、fortran スタイルの出力のoption(7) = 1が機能しなかったので、今調べています。

0 投票する
0 に答える
344 参照

c - 配列の受け渡しでアクセス違反エラー

前に尋ねた質問に対する答えを見つける前に、 Fortranで C 関数を呼び出すために、以下のように非常にシンプルなメッシュ (三角形が 2 つしかない) の非常に単純なコードを書きました。コードの簡素化のため。ここのインターフェースモジュールも iso_c_binding(可能な限り) もここでは使用されていません。この投稿と非常によく似ていますが、別のエラーがあります。

eindのため、アクセス違反エラーが発生します。eindの代わりにc_null_ptrが渡された場合、とにかく実行されます。配列eindのサイズと要素数が一致しています。どうすれば修正できますか?=>解決しました。ありがとうございました!

私が抱えていた問題は、METIS_PartMeshNodal を呼び出す際の systax エラーでした。2 番目の引数は、1 番目の引数 ne と同じ ne でした。nnだったはずです。
解決策は、2 番目の引数をnnに置き換えることでした。上記のコードはコンパイルして実行できます。

注:メッシュが小さすぎると、METIS のスキームにより適切な解が得られない場合があります。インターフェイス モジュールを使用するには、別の投稿
を 参照してください。

0 投票する
1 に答える
2531 参照

c++ - 2003 ISO C バインディングを使用して Visual Studio 2010 で Fortran から C++ 関数を呼び出す

Fortran プログラムから C++ 関数を呼び出す必要があります。私は Visual Studio 2010 を使用しています。この本http://www.amazon.com/Guide-Fortran-Programming-Walter-Brainerd/dp/1848825420の 2003 ISO C バインディングに関する関連する章を読みました。219ページの簡単な例をコンパイルして実行しようとしましたが(以下にコピーしました)、「エラーLNK2019:関数_MAIN__で参照されている未解決の外部シンボル_c」と表示されます。これらは私が従った手順です。

1) Fortran のメイン プログラムとモジュールを使用して Fortran プロジェクトを作成し、それを "スタートアップ プロジェクト" として設定しました。

2)「スタティック ライブラリ」タイプの C++ プロジェクトを作成しました。

3)ここで説明されているように、$(IFORT_COMPILERvv)\compiler\lib\ia32を追加しましたhttp://software.intel.com/en-us/articles/configuring-visual-studio-for-mixed-language-applications

コンパイルすると、そのエラーが発生します。Call C 行にコメントを付けると、完全に実行されるため、C 関数が見つからないだけです。なにか提案を?前もって感謝します。C および Fortran コードは次のとおりです。

0 投票する
1 に答える
706 参照

fortran - c_ptr は Fortran でどのように割り当てられますか?

フィールドが c_ptr (iso_c_binding から) である Fortran 派生型と、その型の 2 つの変数 A と B が与えられた場合、代入 A = B はどのように定義されますか? ポインターが fortran ポインターである場合、それらは実際には代入中に逆参照されます。c_ptr についても同じですか。

0 投票する
1 に答える
555 参照

c - Fortran/C プログラムを 32 ビットからマルチアーキテクチャーにアップグレードする

32 ビット システムでは機能するが、64 ビット コンパイラでは警告と懸念が発生する、C 呼び出しを含む少し古い Fortran プログラムを見ています。このプログラムは、動的に割り当てられたメモリへの C ポインタのアドレスを として格納します。このメモリintは、Fortran 側で として共有されINTEGERます。int私の懸念は、64 ビット整数システムでは、C ポインターからのキャストが/として格納できるものよりも大きくなる可能性があることINTEGERです。既存のプログラムを 2 つのファイルでこの例に簡略化しました。

フォートラン: this.f

子:that.c

コンパイル

-m32このプログラムは、32 ビット (ここでは問題ありません) および-m6464ビット用の GNU コンパイラでコンパイルできます。C コードをコンパイルすると、いくつかの警告が発生します。

残りのコンパイルとリンクは問題なく、プログラムは動作します。

質問

calloc4 バイト整数のデータ制限内に収まるアドレスが返されたように見えcallocますが、より大きな整数のアドレスを返すリスクはありますか? でキャストする(intptr_t)と、コンパイルの警告が表示されなくなりますが、ポインターが切り捨てられたアドレスにキャストしようとすると、上位ビットが切り捨てられ、「セグメンテーション違反」が発生すると思われます。これは正しいです?

私は何をすべきか?Fortran コードに修正を加える必要がありますか?