我正在用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'
程序在释放模式下完美运行。如果我删除其中一个print语句(或两个),就会得到上面的错误!
有人知道这里可能发生了什么吗?
更多信息:
Fortran中的函数声明是:
!DEC$ ALIAS myfunction, 'myfunction'
C中的函数声明是:
extern "C" void myfunction(double *arg1, double *arg2, ...)
这是堆栈损坏的常见症状。可能,你用错误的参数调用myfunction
,但它可能在它内部更深的地方。检查每个调用并检查所有参数的类型。
在调试时一定要尽量使用-check all
和-warn all
。这包括-warn interfaces
,它在类似的问题中非常有用,但因为你调用的是C函数,它可能不会在这里找到原因。
EDIT - for 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
。
在任何情况下,仔细检查所有参数的类型和正确位置,无论它们的最终数目是多少