問題タブ [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 - スレッドを維持する (pthread、c)
次のような状況があります。
Fortran プログラムはiso_c_binding
、関数を介してサーバー (ソケット関数) を起動する関数 (C で記述) を呼び出しpthread_create
ます。このサーバーは、特定の変数が に設定されるまで実行 (接続を待機) し続けることになっています1
。私が抱えている問題は、サーバーを起動する関数が (Fortran プログラムに) 戻るとすぐに、サーバー スレッドが終了することです。状況を処理する方法がわかりません(停止する信号を取得するまでサーバーソケットを実行します)。
敬具
(コード追加)
fortran プログラム
c サーバーコードを実行する
Cサーバーコード
"c run server code" の "Server running" ステートメントの後 (リターン 0 の前) に while(1) ループを追加すると、サーバーは動作し続け、メッセージを読み続けます。私は、Fortran プログラミングも C プログラミングも専門家ではないと言わざるを得ません。
algorithm - C ルーチンを呼び出す前に Fortran 配列を効率的に変換する方法
次の Fortran サブルーチンがあるとします。
また、これc_test
は、ベクトルに対して機能し、結果を変数x
に返すC ルーチンへのポインターであるとします。value
これは完全に機能しますが、それについて質問があります。
ベクトルの変換はx
、サブルーチンを呼び出すアルゴリズムの複雑さに劇的な影響を与える可能性がありますf_test
。つまり、そのようなアルゴリズムが時間を呼び出す場合、アルゴリズムf_test
n
の複雑さは 2 次になりますが、この変換がなければ単純に線形になります。したがって、この方法で行われるこの変換は実際的ではありません。この問題を回避する合理的な方法はありますか?
c - C から fortran サブルーチンへのポインターの受け渡し
C から Fortran サブルーチンを呼び出そうとしていますが、C で割り当てて Fortran へのポインターを安全に渡すことはできますか? サブルーチン内の配列は自動配列 (x(nmax)) です。
(x を割り当ててから fortran に渡します)
c++ - C++ と Fortran が混在するプログラムの Makefile コンパイルの問題
これは私のメイクファイルです:
これは私が cuda_kernels.cu nvcc -c -arch sm_20 -lcuda -lcudart -lcusparse cuda_kernels.cuをコンパイルする方法です
これは私がエラーのために得るものです
以下はupcg7.fです(これは私のコードではありません。ここからダウンロードします) https://github.com/jdhughes-usgs/modflow-2005-upcg/blob/master/code/src/UPCG/upcg7.f
以下はupcgc.cppとupcgc.hです(これは私のコードではありません。ここからダウンロードします) https://github.com/jdhughes-usgs/modflow-2005-upcg/blob/master/code/src/UPCG/ upcgc.cpp
**質問です** SUPCGILU0A は upcg7.f で定義されているサブルーチンです。そしてサブルーチン SUPCGILU0A が C++ プログラム upcgc.cpp から呼び出されます。upcgc7_init、upcgc7、upcgc7_final は upcgc.cpp で定義されており、これら 3 つが fortran プログラム upcg7.f から呼び出されます。
私の調査から、これらはリンカの問題である可能性が高いこと、または C++ と Fortran が関数/ルーチンを別の関数/ルーチンから変換する必要があることを理解していますが、問題が何であるかを理解できません。問題が何であるかについて何らかの洞察を持っている可能性のある人はいますか?
c++ - C++ 配列を Fortran サブルーチンに渡すと、結果に nan 値が表示される
C++ アプリケーションから Fortran コードを使用しようとしています。具体的には、SLATEC のdrc3jj.fとやり取りしようとしています。ただし、Fortran サブルーチンは、関数に渡されたパラメーターに応じてサイズが異なる配列を返します。
配列のサイズが 1 の場合、出力する C++ 配列には適切な値が含まれています。ただし、このサイズが 1 より大きい場合、C++ 配列には、出力値があるべき場所に NaN が含まれます。
以下は私が使用するコードです。これは、Fortran サブルーチンを C++ アプリケーションにリンクするだけです。
お肉はここまで。実際に C++ から Fortran サブルーチンを呼び出し、出力を出力します。
プログラムを で呼び出すと./myProgram 2 8 2 8
、適切に 1/sqrt(21) が出力されます。./myProgram 2 8 2 7
ただし、配列のサイズが実際には 2 であるを試すと、次の結果が得られます。
NaN は実際には適切な符号を持っています。
とにかく、C++ 配列を Fortran に渡す別の (適切な) 方法はありますか? これも問題ですか?
winapi - gcc (gfortran) でコンパイルするときに Windows API 関数 (64 ビット) を呼び出すことはできますか?
以前に lf90 を 32 ビットとしてコンパイルしたサブルーチン sendmsg.f90 を、gcc を 64 ビットとしてコンパイルしようとしています。目的は、gcc でコンパイルされた他の 64 ビット サブルーチンとリンクすることです。
Lahey Fortran 7.5 には、lf90 コンパイラと gcc (gfortran を使用)、および lgf と呼ばれるもの (gcc を使用すると思われますが、そうですか?) が含まれています。
私は Windows プログラミング (および Fortran) の初心者です。gcc でコンパイルされたコードは、Windows API を呼び出すことができますか? ISO_C_BINDING を使用する必要がありますか?
これを行う必要がありますか、それとも lf90 によって作成された .obj ファイルを gcc によって作成された .o ファイルにリンクする必要がありますか?
ご協力いただきありがとうございます!
更新: Windows API を次のように呼び出してみました:
しかし、「gcc -m64 sendmsg.f90」でコンパイルしようとすると、エラーが発生します。
このアプローチは理にかなっていますか?SendMessage への参照が定義されていないのはなぜですか?
fortran - MATLAB mex c + Fortran エラー
c と fortran で書かれたファイルで構成されたプロジェクトを mex しようとしています。簡単にするために、この単純な関数を作成しました。
mysum.f
およびtest.c
Intel Fortran Compiler (x64) を使用して、次を実行します。
ifort /c mysum.f
mysum.obj を作成します
Matlab (x64) では、Microsoft SDK をコンパイラとして使用しており、次のように記述しています。
mex -O -largeArrayDims LINKFLAGS="$LINKFLAGS /NODEFAULTLIB:MSVCRT.lib" test.c mysum.obj
残念ながら、次のエラーが発生します。
test.obj : エラー LNK2019: 関数 mexFunction で参照されている未解決の外部シンボル mysum test.mexw64 : 致命的なエラー LNK1120: 1 つの未解決の外部
この時点で私は立ち往生していて、何をすべきかわかりません。MSVCRT.lib との競合があったため、オプション /NODEFAULTLIB を使用しています。
助けが必要です。