【发布时间】:2010-07-20 03:18:08
【问题描述】:
我在将数组从 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)
目前我收到运行时错误“浮点溢出”。在某些情况下,数组正确的元素。
【问题讨论】:
-
您只是向我们展示了 cFunc 的声明——数据的接收者。我们需要看调用代码(数据的发送者)
-
你在什么平台上编译这个?您应该列出操作系统和芯片架构,因为这可能会有所不同。
-
real_normal 的确切定义是什么?并在调用 cFunc 之前分配了数组?在 fortran 中阅读有关 C 绑定的内容并使用诸如 c_double 之类的内容可能会有所帮助。如果您搜索
iso +c binding fortran,您会找到一些阅读内容;或者在你的 fortran 编译器的手册中,如果它提供了模块。 -
我认为,使用 c_double 的方式有效。如果你回答我的问题,我会接受。
-
我做C/Fortran接口已经快20年了,但我还记得一点。 REAL 通常是 32 位浮点数。但是我认为 Fortran 过去常常为数组的长度(32 位 int)添加一个额外的参数。此外,在 Windows 上,Fortran 过去使用 __WINAPI 参数传递而不是基本的 C 传递。