Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C语言中Fortran中REAL(种类=REAL_normal)的等效类型是什么?_C++_C_Fortran - Fatal编程技术网

C++ C语言中Fortran中REAL(种类=REAL_normal)的等效类型是什么?

C++ C语言中Fortran中REAL(种类=REAL_normal)的等效类型是什么?,c++,c,fortran,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

我在将数组从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函数的接口(代码简化为一个元素,这会产生问题,实际函数有更多参数):

fortran中的内存分配为

ALLOCATE (array(numberOfElements))
call cFunc(array)

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

REAL
可能默认为
REAL*4
,在这种情况下,您希望使用
float*
而不是
double*


在使用函数之前,还要确保您正在对其进行原型设计,否则在没有理由不使用的情况下,C会自动将
float
s升级为
double
s。并确保您没有采用
双精度
,然后采用地址并将其作为
浮点*
实数\u普通
32位还是64位浮点?如果将函数声明为
void cFunc(float*data)
,会发生什么情况

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


正如另一位回答者所建议的,调查Fortran 2003与C特性的互操作性。如果你的编译器没有实现这些,那就放弃它,找一个能实现的编译器。

@High Performance Mark的建议非常好,我强烈推荐Fortran 2003的ISO_C_绑定(由许多Fortran编译器支持)对于Fortran和C之间的互操作性——这里有一个更大的问题使得ISO_C_绑定更有用:Fortran可分配数组比普通数组更复杂。如果你“破解它”并直接传递一个指向C代码的指针,你很可能传递一个指向描述可分配数组的Fortran内部结构的指针,而不是指向数值序列的指针。ISO_C_绑定不直接支持可分配数组,但如果编写ISO_C_绑定接口(与我最初编写的不同),《Fortran 95/2003解释》一书应该可以工作表示编译器将识别被调用的例程未接收可分配数组,并将执行copy-in/copy-out以匹配数组


另外,我的猜测是,对于一个简单的可分配的实际参数,不需要复制入/复制出。当编译器通过显式接口(可以是ISO_C_绑定接口)识别被调用例程的伪参数不是可分配的时,编译器应该能够从可分配的描述中提取指向实际数组的指针,并将其作为参数传递。在某些情况下,需要进行复制输入/复制输出,例如指向非连续数组的指针,例如具有非单位跨距的指针(例如,指向元素1、3、5等的指针)。但是如果没有任何接口,编译器很可能会传递可分配数组的描述符,这不是C所期望的….

您只是向我们展示了cFunc的声明——数据的接收者。我们需要查看调用代码(数据的发送者)您是在什么平台上编译的?你应该列出操作系统和芯片架构,因为这可能会有所不同。什么是真正的正常定义?在调用cFunc之前是否分配了数组?在fortran中阅读一些关于C绑定的知识,并使用诸如C_double之类的东西可能会有所帮助。如果搜索
iso+c绑定fortran
;或者在fortran编译器的手册中,如果它给出了模块的话。我认为,使用c_double的方法是可行的。如果你回答了我的问题,我会接受的。我做C/Fortran接口已经将近20年了,但我仍然记得一点。实数通常是32位浮点。然而,我认为Fortran使用了一个额外的参数来表示数组的长度(32位int)。此外,在Windows上,Fortran过去使用_WINAPI参数传递而不是基本的C传递。我无法更改Fortran代码。所以我必须采用我的C代码。对于float,它也不起作用。例如,对于long double,我得到“浮点溢出”。(我使用的是英特尔VS编译器)。请仔细检查:(1)原型在调用C之前出现,以及(2)传递的不是指向不同类型float的指针。win32,在访问数据后,我会出现运行时错误。
ALLOCATE (array(numberOfElements))
call cFunc(array)