Fortran .dllと同じソースファイルを使用コンパックビジュアルFortran 6.6CまたはインテルVisual Fortran 12.1.3.300でコンパイルできますIA-32)。問題は、インテルのバイナリでは実行に失敗しますが、Compaqではうまくいきます。私はWindows 7の64ビットシステムで32ビットをコンパイルしています。 .dll呼び出しドライバはC#
に書かれています。インテルVisual Fortranでコンパイルされ、コンパックVisual Fortranでコンパイルされた場合にのみサブルーチンコールでスタックオーバーフローが発生する
エラーメッセージは、内部サブルーチンが呼び出されたとき(.dllエントリルーチンから呼び出されたとき)、_chkstk()
コールから派生しています。 crpm
を除いて同様の変数仕様の
CALL SRF(den, crpm(i), i, inose, qeff(i), rev(i),
& qqmax(i), lvtyp1, lvtyp2, avespd, fridry,
& luin, luout, lurtpo, ludiag, ndiag, n, nzdepth,
& unit, unito, ier)
:問題の手順は
SUBROUTINE SRF(den, crpm, icrpm, inose, qeff, rev,
& qqmax, lvtyp1, lvtyp2, avespd, fridry, luin,
& luout, lurtpo, ludiag, ndiag, n, nzdepth,
& unit, unito, ier)
INTEGER*4 lvtyp1, lvtyp2, luin, luout, lurtpo, ludiag, ndiag, n,
& ncp, inose, icrpm, ier, nzdepth
REAL*8 den, crpm, qeff, rev, qqmax, avespd, fridry
CHARACTER*2 unit, unito
と、このように呼ばれる(固定ファイル形式はご容赦)として宣言されている
(SO chkstk()
に答えます) qeff
,rev
およびqqmax
は、i-th
要素のみが各呼び出しに使用される配列です。
引数が8kb
より大きい場合はスタックの問題が考えられますが、この場合は渡された引数に7 x real(64) + 11 x int(32) + 2 x 2 x char(8) = 832 bits
しかありません。
は、私はモジュールに引数(特に配列)を移動するために本当に熱心に取り組んできましたが、私は同じエラー
を得続けます。インテルの.dllが
dissasemblyあるからコンパックの.dllは誰が何であるか上の任意の提案を提供することができます
ですからdissasemblyそれを引き起こす、またはそれをどのようにデバッグするのですか?
PS。私は予約されたスタックスペースを数百に増やしてMb
となり、問題は解決しません。私はdissacemblerのchkstk()
呼び出しをスキップしようとしましたが、プログラムがクラッシュしました。スタックチェックはアドレス0x354000
から開始し、0x2D2000
に反復し、ガードページへのアクセスがクラッシュします。スタックボトムアドレスは0x282000
です。
どちらのコンパイラオプションを使用していますか?コンパイルを試みると、すべての警告エラーフラグが有効になっていると考えることができます。最初のステップとして、 '-std -check all -warn all、nodec、interfaces、declarations -gen_interfaces -g -C -traceback -fpe0 -fp-stack-check'とifortを使います。 – Chris
私は今までにあなた自身の算術ミスを見つけたと思っていますが、合計832バイトは832ビットでなければなりません。各文字が1バイトで表されることは必ずしもそうではありません。これはコンパイラとプラットフォームによって異なる傾向があります。最新のコンパイラでは、さまざまな '記憶単位'のサイズが、ISO_FORTRAN_ENV組み込みモジュールで定義された定数として使用できます。 –
上記の両方のコメントは、私に何か協力するものです。私はもっと調査します。 'CVF'がキャッチしていないスタックの破損があり、何とかそれを吹き飛ばす可能性があります。多くの開発者が最初に書かれた80年代からそれに触れてきたので、コードには多くのことがあります。 – ja72