函数调用崩溃由print语句修复

时间:2014-03-11 21:47:30

标签: fortran intel-fortran

我正在使用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, ...)

1 个答案:

答案 0 :(得分:4)

这是堆栈损坏的常见症状。可能是你用错误的参数调用myfunction,但它可能在其中更深处。检查每次调用并检查所有参数的类型。

调试时务必使用if -check all-warn all。这包括-warn interfaces,这在类似问题上非常有用,但是因为你正在调用C函数,所以它可能在这里找不到原因。

编辑 - 2参数子程序:

在您的情况下,请确保两个参数均为double precisionc_doublereal*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

无论如何,仔细检查所有参数的类型和正确位置,无论它们的最终数量是多少。