通过print语句修复了函数调用崩溃



我正在用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 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

在任何情况下,仔细检查所有参数的类型和正确位置,无论它们的最终数目是多少

最新更新