我有一个从Fortran传递数组到c函数的问题: 在fortran中,数组定义为
REAL(KIND=real_normal) , DIMENSION(:), ALLOCATABLE :: array
call cFunc(array)
如果将cFunc定义为
void cFunc(double *data){...}
比数据只包含“垃圾”值。在这种情况下问题在哪里? (用整数很好地解决这个问题)。
THX。 编辑: 我的平台: 编译器:VS 2008,英特尔编译器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)
目前我收到运行时错误“浮点溢出”。在某些情况下,数组是正确的元素。
答案 0 :(得分:4)
片段REAL(KIND=real_normal)
不是数据类型的完整标准规范。在源代码中你必须有一个变量real_normal
的声明。我猜它声明array
是4字节或8字节的浮点数,但这只是猜测。 array
不是默认浮点数的数组(Fortran称为real
)。
正如其他回答者所建议的那样,调查与Fortran 2003的C 功能的互操作性。如果您的编译器没有实现这些功能,请抛弃它并获得一个编译器。
答案 1 :(得分:2)
P.S。我的猜测是,对于一个简单的可分配实际参数,不应该需要copy-in / copy-out。当编译器通过显式接口(可能是ISO_C_Binding接口)识别出被调用例程的伪参数不是可分配的时,编译器应该只能从可分配的描述中提取指向实际数组的指针。传递它作为参数。在某些情况下将需要复制/复制输出,例如指向非连续数组的指针,例如具有非单位步幅的指针(例如,指向元素1,3,5,...的指针)。 )。但是没有任何接口,编译器可能会传递可分配数组的描述符,这将不是C所期望的....
答案 2 :(得分:0)
REAL
可能默认为REAL*4
,在这种情况下,您需要float*
而不是double*
。
在使用之前,请确保您正在对该功能进行原型设计,否则C会在没有理由的情况下将float
自动提升为double
s。并确保您没有使用double
然后获取地址并将其作为“{1}}”传递。
答案 3 :(得分:0)
real_normal
是32位还是64位浮点?如果将函数声明为void cFunc(float*data)
会发生什么?