c-Fortran中C中REAL(KIND = real_normal)的等效类型是什么?

我将数组从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所期望的.

上一篇:g77介绍 g77 是 Fortran77 的编译器。它对 Fortran 77 标准提供完备的支持,并支持 Fortran 90 和 95 的部分特性。 由于 Fortran 77 标准在数值计算中


下一篇:Python读取Fortran二进制文件