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

我有一个从Fortran传递数组到ac函数的问题:在fortran中,数组被定义为

REAL(KIND=real_normal) , DIMENSION(:), ALLOCATABLE :: array call cFunc(array) 

如果将cFunc定义为

 void cFunc(double *data){...} 

比数据只包含“垃圾”值。 在这种情况下问题在哪里? (用整数很好地解决这个问题)。

谢谢。 编辑:我的平台:编译器: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) 

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

@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以匹配数组。

PS我的猜测是,对于简单的可分配实际参数,不应该需要复制/复制。 当编译器通过显式接口(可能是ISO_C_Binding接口)识别出被调用例程的伪参数不是可分配的时,编译器应该只能从可分配的描述中提取指向实际数组的指针。传递它作为参数。 在某些情况下将需要复制/复制输出,例如指向非连续数组的指针,例如具有非单位步幅的指针(例如,指向元素1,3,5,…的指针)。 )。 但是没有任何接口,编译器可能会传递可分配数组的描述符,这不会是C所期望的….

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

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

real_normal是32位还是64位浮点? 如果将函数声明为void cFunc(float*data)什么?

REAL可能默认为REAL*4在这种情况下,您需要float*而不是double*

在使用之前还要确保你正在对函数进行原型设计,否则C有一种倾向,即在没有理由的情况下自动将float s提升为double 。 并确保你没有采取double ,然后取一个地址并将其作为“ float* ”传递。