使用 Fortran .dll 的相同源文件,我可以使用 Compaq Visual Fortran 6.6C 或 Intel Visual Fortran 12.1.3.300 (IA-32) 编译它们。问题是在 Intel 二进制文件上执行失败,但在 Compaq 上运行良好。我在 Windows 7 64 位系统上编译 32 位。.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
.