問題タブ [silverfrost-fortran]
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.
fortran - Fortran 95 で別のファイルからモジュールをインクルードする方法は?
質問は明らかだと思いますが、グーグルで調べましたが、解決策が見つかりませんでした。ソース コードを分割して、より保守しやすくしたいと考えています。別のファイルでモジュールを参照するにはどうすればよいですか?
fortran - 実数が必要なときに、プロシージャとして引数を使用してルーチンを呼び出そうとしました
問題なくコンパイルされる Fortran プログラムがありますが、エラーが発生します。
実数 (種類 = 2) が必要なときに、引数番号 1 を持つルーチンをプロシージャとして呼び出そうとしました
ROOTS!X_ROOT - ファイル Exercise2base.f90 の 20 行目 [+0074]
main - ファイル Exercise2base.f90 の 65 行目 [+00c8]
これが何を意味するのかよくわかりません。おそらく、正しい型ではない関数に引数を渡すことを意味していると思いましたが、与えられた参照は意味がありません:
- 20行目は
end function x_rtsmpl
- 66行目は
answer=x_root(bb_integral,l1,l2,epsx,epsf,root_type)
だから何が起こっているのか理解できません...
Plato IDE で Silverfrost を使用しています。
編集:コードは、宣言と単純な「ダミー」計算のみを使用して、基本的な機能に至るまでトリミングされています。
fortran - アクセス違反エラーのデバッグ: 3071E05A0 ではなく 2071E05A0 への書き込み
最終編集:
Silverfrost フォーラムの一部のユーザーは、コードの簡素化と解決策について非常に役立つように指示してくれました。
この問題は、次のコードを使用して再現できます。
MXAV
この問題は、メモリの問題を示唆する 182 を超える場合にのみ発生します。実際、183 * 1714 * 1714 * 4 の次元を掛けると、2GB を超え、スタック サイズを超えます。
解決策は、次のようにヒープを使用することです (Fortan 95)。
これを行うと、2GB 以上を割り当てることができ、アレイは正常に機能します。コードのこの小さなセクションが元になっているプログラムは数年前のものであり、構築したモデルが以前よりも何倍も大きいため、この問題に遭遇したのはつい最近のことです。Fortran 77 では ALLOCATABLE 配列を使用できないため、スタックの使用量を減らすか、コードを移植するか、別の最適化を行う必要があります。
追加するために編集:
再現可能なコードを含む git リポジトリをまとめました。
概要
32 ビットにコンパイルすると正常に動作するプログラムがありますが、コンパイルして 64 ビットで実行するとアクセス違反エラーが発生します。
Silverfrost Fortran コンパイラ、FTN95 v8.51 を使用していますが、この問題は v8.40 および v8.50 を使用すると発生します。
サンプルコード
注: この関数zonedef
は、実行したい計算に対してゾーンが有効であることを確認するだけです。この関数は を返しますlogical
。
デバッグ
最初に述べたように、このプログラムの 32 ビット コンパイル バージョンは問題なく動作します。64 ビット バージョンを実行しようとすると、最初のループの出力は次のようになります。
sdbg64.exe から:
例外をファイルに書き込みます:
残りは…我慢してください。私は訓練を受けたソフトウェア エンジニアでも Fortran 開発者でもありません。
の値ZNZNDAAV(1,337,337,1003)
は 2.241640 で、これは に追加されていZNZNDAAV(1,337,1714,1003)
ます。これは、例外出力に詳細が示されているように、レジスター XMM11 と一致します。この値は address にあります000000029BA3BD60
。もう 1 つの値は address にあります00000003071E05A0
。
IIUC では、relocmon.inc でCOMMON /DDMON/
次元配列を含むように設定しているznzndaav
ため、ソフトウェアが正常に機能していた場合、問題の値のアドレスは/DDMON/
ブロック内にあります。のアドレス範囲は/DDMON/
ですz'000000027FFF6040' - z'0000000307421150'
。私のロジックが正しい場合、違反はこのブロックの外で発生します。
00000002071E05A0
プログラムがを使用すべきときにに書き込もうとしているように私には思え00000003071E05A0
ます。
なぜこれが当てはまるのかを判断するのを手伝ってくれる人はいますか? それには何か体系的なものがあるように見えます - それは単なる偶然でしょうか?
fortran - 三角関数に対する Fortran の倍精度
次のコードを使用してinを計算cos
しています。pi/2
Fortran
gfortran
と を使用してコンパイルしftn95
ました。両方から、出力は
ここでより良い精度を得るにはどうすればよいangle
ですか? たとえば、を使用したすべての宣言について、 のC++
順に表示されます。E-18
double
よりよく説明するためにさらに情報が必要な場合はお知らせください。
Extra : 私が使用しているメイン コードは、三角項を持つ物理方程式を使用しており、精度の問題があり、完全にはわかりませんが、これが原因ではないかと疑っています。したがって、上記が何らかの形で改善できるかどうかを確認したいと思います。Fortran
これを理解するのに苦労している専門家ではありません。