我将数组从Fortran传递到c函数时遇到问题:
在fortran中,数组定义为
REAL(KIND=real_normal) , DIMENSION(:), ALLOCATABLE :: array
call cFunc(array)
如果将cFunc定义为
void cFunc(double *data){...}
数据比仅包含“垃圾”值.在这种情况下问题出在哪里? (使用整数可以很好地解决此问题).
谢谢.
编辑:
我的平台:
编译器:VS 2008,Intel编译器11版本
操作系统:Win7
编辑2:
我像这样定义C函数的接口(代码被简化为一个元素,这会引起问题,实函数具有更多参数):
interface c_interface
subroutine cFunc(array) bind (C, name = "cFunc")
use iso_c_binding
REAL(c_double), DIMENSION(*)::array
end subroutine cFunc
fortran中的内存分配有
ALLOCATE (array(numberOfElements))
call cFunc(array)
目前,我收到运行时错误“浮点溢出”.在某些情况下,数组会纠正元素.
解决方法:
@High Performance Mark的建议非常好,我强烈推荐Fortran 2003的ISO_C_Binding(受众多Fortran编译器支持)以实现Fortran和C的互操作性–这里有一个更大的问题,使ISO_C_Binding更有用:Fortran可分配数组是比普通数组更复杂.如果“黑客入侵”并直接将指针传递给C代码,则可能会将指针传递给描述可分配数组的Fortran内部结构,而不是指针传递数值序列. ISO_C_Binding不直接支持可分配数组,但是如果您编写ISO_C_Binding接口(与我最初编写的接口不同),该数组应该可以工作-《 Fortran 95/2003解释》一书说编译器将识别出被调用的例程是“接收可分配的数组,并将执行复制/复制以匹配数组.
附:我的猜测是,对于简单的可分配实际参数,不需要复制/复制.当编译器通过显式接口(可以是ISO_C_Binding接口)识别出被调用例程的伪参数不是可分配的时,编译器应仅能够从可分配的描述中提取指向实际数组的指针,并且将其作为参数传递.在某些情况下,需要复制/复制,例如指向非连续数组的指针,例如具有非单位跨度的指针(例如,指向元素1、3、5的指针. ).但是如果没有任何接口,编译器可能会传递可分配数组的描述符,而这并不是C所期望的.