Fortran中用于REAL(KIND = real_normal)的C中的等价类型是什么?

时间:2010-07-19 15:56:28

标签: c++ c fortran

我有一个从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)

目前我收到运行时错误“浮点溢出”。在某些情况下,数组是正确的元素。

4 个答案:

答案 0 :(得分:4)

片段REAL(KIND=real_normal)不是数据类型的完整标准规范。在源代码中你必须有一个变量real_normal的声明。我猜它声明array是4字节或8字节的浮点数,但这只是猜测。 array不是默认浮点数的数组(Fortran称为real)。

正如其他回答者所建议的那样,调查与Fortran 2003的C 功能的互操作性。如果您的编译器没有实现这些功能,请抛弃它并获得一个编译器。

答案 1 :(得分:2)

@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解释”说编译器将识别被调用的例程isn'接收可分配的数组,并执行copy-in / copy-out以匹配数组。

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)会发生什么?