我正在使用visual studio 2012和intel fortran 2013在Windows上编译Fortran程序。在程序中,我调用了一个静态库的C函数:
call myfunction(arg1,arg2,...);
当我在调试模式下运行时,一切都很好。当我在发布模式下运行时,程序在该函数调用期间崩溃(我通过在调用之前/之后打印到屏幕来测试它),并出现以下错误:
forrtl: severe (157): Program Exception - access violation
现在有趣的部分,如果我在调用之后和之前添加print语句,如下所示
print 'Calling myfunction'
call myfunction(arg1,arg2,...);
print 'myfunction finished'
程序在发布模式下运行完美。如果我删除其中一个打印语句(或两者),我会收到上述错误!
有没有人知道这里会发生什么?
更多信息:
Fortran中的函数声明是:
!DEC$ ALIAS myfunction, 'myfunction'
C中的函数声明是:
extern "C" void myfunction(double *arg1, double *arg2, ...)
答案 0 :(得分:4)
这是堆栈损坏的常见症状。可能是你用错误的参数调用myfunction
,但它可能在其中更深处。检查每次调用并检查所有参数的类型。
调试时务必使用if -check all
和-warn all
。这包括-warn interfaces
,这在类似问题上非常有用,但是因为你正在调用C函数,所以它可能在这里找不到原因。
编辑 - 2参数子程序:
在您的情况下,请确保两个参数均为double precision
或c_double
或real*8
,具体取决于您使用的声明类型。不要在那里提出任何第三个论点,因为你的第一段代码可能会建议!
在Fortran 2003
中对此进行接口的现代方法是:
interface
subroutine myfunction(arg1, arg2) bind(C, name="myfunction")
use iso_c_binding
real(c_double) :: arg1, arg2
end subroutine
end interface
在代码的声明部分中放置而不是旧的(和可选的)external myfunction
。
无论如何,仔细检查所有参数的类型和正确位置,无论它们的最终数量是多少。