Fortran90和在C++中创建的数组的大小

Fortran90 and size of arrays created in C++

本文关键字:数组 创建 和在 C++ Fortran90      更新时间:2023-10-16

我正试图从C++主程序中调用一些Fortran 90代码。Fortran子程序采用一个双精度数组(称为X)作为参数,然后在代码的许多地方使用size(X)。我用通过创建的C数组调用例程

double *x = new double[21]

但是当我在Fortran代码中打印size(X)的结果时,我得到了837511505,或者其他一些大数字。

现在我可以修改fortran代码,所以最坏的情况是重写函数,将大小作为参数传递。但我宁愿不这么做。

有人知道我是否有办法创建C数组,使Fortran例程能够计算出它的大小吗?

这是一个特定于实现的特性。许多实现(例如RSX和OpenVMS)定义了一个结构,用于传递指向数据的指针以及维度、类型等的描述。其他实现不传递这样的东西,除非外部声明显式调用生成描述符的机制。大多数其他机构没有提供这种机制。

不知道使用哪种实现:

a) 阅读编译器文档
b) 让编译器生成程序集,并对其进行检查以查看的预期结果

Intel F95使用数组描述符结构,该结构除了数组指针外,还存储边界和维度信息。size()从描述符中获取信息。

由于您只从C指针传递,所以没有可用的描述符信息,因此size()返回胡言乱语。

一般来说,您所处的领域是混合语言编程,其中数组和结构通常是程序员的痛苦所在。英特尔编译器用户文档有一个单独的关于C<=>的部分F95混合呼叫。

特别是,检查接口和绑定——这是一个很好的F95功能,有助于进行语言间调用。

好消息,C<=>一旦你遵守惯例,F95调用就非常有效。

我个人使用了从c++到fortran 90/95/2003的大量混合编码。我通常使用gfortran作为编译器,但为了避免这个问题,通常的做法是始终发送数组的大小。这甚至允许您更改形状。考虑一个包含x,y点的二维数组:

double* x = new double[2*21]
real(8),intent(in),dimension(2,21)::x

这是一个非常方便的功能,然后可以使用size命令。关于编译器细节的答案是正确的。为了使代码在大多数编译器上可用,您应该在使用多语言接口时指定长度。