問題タブ [f2c]
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の外部構造体
次のC構造を含むf2c(FortranからCへのトランスレーター)で生成されたCファイルがあります。
const_
f2cによって生成された変数を変更せずに、この変数を別の.cファイルで外部として宣言するにはどうすればよいですか?
c++ - C ++コンパイラで最適化すると、F2Cで変換されたコードが壊れます
次のようなメソッドを持つC++プログラムがあります。
最適化が有効(/ O2)の場合、最初のポインターがデクリメントされる最初の行は実行されません。最適化されたビルドと最適化されていないビルドを並べてデバッグし、最適化されていないプログラムが実行している間に、最適化されたビルドステップをデクリメントします。これにより、後でarr[*index]を使用して配列にアクセスしたときに動作に観察可能な違いが生じます。
アップデート
@stefaanvが指摘したように、デクリメントがデクリメントされたアクセスインデックスに変更された場合、コンパイラはデクリメントを実際に省略できます。したがって、省略されたデクリメントは、動作の違いを引き起こしているものではありません。代わりに、それを引き起こすマトリックスの使用に何かがあります。
さらに見てみると、行列の乗算を実行するネストされたループを含むメソッドに絞り込みました。メソッドの一部は次のようになります。a、wa、tの3つの配列が含まれます。メソッドの最初では、f2cトランスレータはデクリメントを使用して、Fortranで6x6の配列がdouble[36]
cでフラットになるようにします。ただし、古いインデックスを使用できるようにするために、配列ポインターをマトリックス内の列数だけ戻します。
通常、このf2c変換プログラムでは、フラット配列はとして渡され&someArray[1]
、メソッドは各配列を1つずつデクリメントすることから始まります。@Christophは、配列が宣言された範囲を超えてデクリメントされることはないため、これは有効である必要があると指摘しました。
このメソッドの場合、渡された配列は、要素へのポインタとしてさらに配列に渡されませんが&someArray[1]
、ここでは、配列は固定サイズで宣言されたローカル静的配列でmat[36]
あり、乗算メソッドに直接渡されます。
したがって、問題は次のとおりです。
これは、動作が未定義であり、f2cがここで行ったことを実行すると、最適化が機能しなくなる可能性があることを意味しますか?つまり、double [36]配列ポインターから7を減算し、配列内の正しい位置(オフセット7)のすべての項目にアクセスしますか?
編集:これはC FAQで見つかりましたが、これはここに当てはまりますか?
ポインタ演算は、ポインタが同じ割り当てられたメモリブロック内、またはその1つ先の架空の「終了」要素を指している場合にのみ定義されます。それ以外の場合、ポインタが逆参照されていなくても、動作は定義され ていません。....参照:K&R2Sec。5.3ページ 100、秒 5.4 pp。102-3、Sec。A7.7pp.205-6; ISO秒 6.3.6; 理論的根拠 3.2.2.3。
更新2:
デクリメントされたポインタではなく、デクリメントされたインデックスを使用して多次元配列で再コンパイルすると、
次に、このメソッドは、最適化に関係なく、同じ(期待される)出力を生成します。1つだけデクリメントされる1次元配列は、問題を引き起こさないように見えます。
プログラム内のすべての多次元配列を上記のアクセス方法を使用するように変更できますが、単一のdim配列は多すぎて手動で変更できないため、理想的には両方で機能するソリューションが必要です。
新しい質問:
- f2cがポインタをいじるのではなく、この配列アクセス方法を使用するオプションはありますか?それはf2cの単純な変更であり、明確に定義されたコードを生成するように思われるので、それはすでにオプションであると思うでしょう。
- この問題に対する他の解決策はありますか(最適化をスキップして、未定義の動作に依存しているにもかかわらず、プログラムが適切に動作することを期待する以外に)。
- C ++コンパイラでできることはありますか?マネージC++プロジェクトとして、Microsoft C ++(2010)でコンパイルします。
f2c - f2c が各サブルーチンと関数の名前を出力しないようにする方法
私たちのビルド スクリプトは、数千のサブルーチンと関数で f2c を実行するため、ビルド出力は次のような大量の出力で構成されます。
f2c バージョン 20100827 を実行しています。
使用される f2c コマンドラインは次のとおりです。
f2cの man ページを見つけましたが、そこに関連するオプションがありません。
f2c ソースコードを編集せずに、文書化されていない機能など、他の方法はありますか?
r - win7 と linux mint での quantreg lib の速度の違い
quantreg
Win7 64bit と Linux Mint Maya 64bit の両方でライブラリを使用していますが、速度に大きな違いがあることに気付きました。
私は Fortran で書かれた Frisch-Newton メソッドを使用しており、.Fortran() 呼び出しの速度のみを測定していました。
長さ1600のベクトルを分析しています。
Windows では約 2.5 秒、Linux では約 22 秒かかります。そして、私は本当に理由を理解していません..
この後、Fortran コードを F2C で C コードに変換し、clapack 関数を使用して動的ライブラリにコンパイルしようとしました。この関数を .C() で呼び出していて、時間効率を再度測定しました。
Windows では 8 秒、Linux では 22.5 秒かかりました。私は本当に混乱しています。
すべてが I7-3770、16GB RAM で行われました。
なぜそれが機能しないのか、誰かが私に説明できますか?
コードは次のとおりです。
Fortran コード:
C コード:
R からの呼び出し:
動的ライブラリのコンパイル:
compiler-errors - 行の構文エラー if (m <= 0 .or. n <= 0) return
次のファイルを でコンパイルするf2c
と、有益でない構文エラー メッセージが表示されて失敗します。
gfortran
エラーなしでコンパイルします。何が原因なのか考えていますか?f2c
as に厳密で、適切なエラー メッセージが表示される Fortran コンパイラを知っていますか?
問題のファイル:
visual-studio-2010 - Fortran を C に変換するときのリンク エラー (f2c を使用)
ほとんどが C であるが、いくつかの Fortran サブルーチンを含むプロジェクトを構築しようとしています。コードは古いので、最新のマシンで動作するようにしています。メイン関数が外部関数を呼び出す
関数は Fortan で書かれたサブルーチンです。
f2c を使用して Fortran コード (このサブルーチンと他のサブルーチンを含む) を変換し、その結果をプロジェクトに入れたいと考えています。
f2c はコードを変換し、結果の C コードはコンパイルされます。プロジェクトをビルドしようとすると、いくつかのリンク エラーが発生します。
これらの関数は、元の Fortran コードにも、他のどこにもありません。f2cのnetlibのソースでそれらの参照のみを見つけました
ご協力いただきありがとうございます
gcc - ライブラリをコンパイルおよびリンクできません
fortran コードに基づいて、matlispと呼ばれる gcc でコンパイルされたライブラリを使用しようとしています。f77 コンパイラを指定した後、autoreconf、configure、および make コマンドを実行して、ファイル libmatlisp.so を取得できました。
しかし、私がそれを使用しようとすると、次のようになります:
そして、コマンド ld libmatlisp.so を実行すると、次のようになります。
状況を改善する方法はありますか?
私はすでにこの解決策を試していますが、うまくいきません。
また、コンパイラを gfortran に変更しようとしましたが、libf2c の一部であるライブラリが見つからないことを示す実行時エラー メッセージがいくつか表示されます。
c++ - C++ から fortran ルーチンを呼び出す方法は?
C++ コードから fortran ルーチン cbesj.f を呼び出したいのですが、どうすれば実現できますか?
私が行った手順は次のとおりです。
cbesj.f と依存関係を netlib amos Web ページ ( http://www.netlib.org/cgi-bin/netlibfiles.pl?filename=/amos/cbesj.f ) からダウンロードします。
ソースディレクトリで、
f2c -C++PR *.f
g++ -c *.c
ar cr libmydemo.a *.o
[test_cbesj.cpp][1] と [mydemo.h][2] を使用して、このようにサブルーチンを呼び出します。
g++ test_cbesj.cpp -lf2c -lm -L. -lmydemo バグを返します:
test_cbesj.cpp:(.text+0xd6): `cbesj_(complex*, float*, long*, long*, complex*, long*, long*)' への未定義の参照
私の問題で cbesj_ サブルーチンを参照する適切な方法は何ですか? ありがとう!
ケーシーに感謝します:あなたのアプローチが最善だと思います。しかし、私はまだ障害を設定しています。なぜですか? どうぞ:
modemo.h で
test_cbesj.cpp で、
それで、
roygvib さん、返信ありがとうございます。実際に良い提案。変更された test_cbesj.cpp は次のとおりです。
もうセグフォルトはありません。しかし、いくつかの理由から、コードは期待どおりに機能しません。
答えは間違っており、 ierr もソースコードからそう言っています: