Fortran .dll に同一のソース ファイルを使用すると、Compaq Visual Fortran 6.6C または Intel Visual Fortran 12.1.3.300 (IA-32) でコンパイルできます。問題は、Intel バイナリでは実行が失敗することですが、Compaq では問題なく動作します。Windows 7 64 ビット システムで 32 ビットをコンパイルしています。.dll 呼び出しドライバーは、.dll で記述されていC#
ます。
失敗メッセージは_chkstk()
、内部サブルーチンが呼び出されたときの恐ろしい呼び出し (.dll エントリ ルーチンから呼び出された) から発生します。(だから答えてくださいchkstk()
)
問題の手順は次のように宣言されています(固定ファイル形式を許してください)
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
そして次のように呼び出されます:
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)
crpm
、qeff
、rev
およびを除いて同様の変数仕様を持つは、各呼び出しに要素qqmax
のみが使用される配列です。i-th
SRF()
引数がサイズよりも大きい場合にスタックの問題が発生する可能性があることは理解しています8kb
が、この場合7 x real(64) + 11 x int(32) + 2 x 2 x char(8) = 832 bits
、渡された引数しかありません。
引数 (特に配列) をモジュールに移動するのに非常に苦労しましたが、同じエラーが発生し続けます
.
Intel .dllからの分解は
Compaq .dllからの分解は、
SOの原因やデバッグ方法について誰か提案できますか?
PS。予約済みのスタック スペースを数百に増やしましたがMb
、問題は解決しません。逆アセンブラーで呼び出しをスキップしようとchkstk()
しましたが、プログラムがクラッシュします。スタック チェックは、アドレスから始まり、ガード ページにアクセスしてクラッシュする場所まで0x354000
反復されます。0x2D2000
スタックのボトムアドレスは0x282000
.