Fortran90和在C++中创建的数组的大小
Fortran90 and size of arrays created in C++
我正试图从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命令。关于编译器细节的答案是正确的。为了使代码在大多数编译器上可用,您应该在使用多语言接口时指定长度。
- 在c++中为double类型的数组创建一个unique_ptr
- 如何从预定义的数组创建某些元素数组
- 基于数组的列表 - 动态数组创建时出错
- 从 UTF-8 字节数组创建字符串?
- 是否可以在并行区域中为共享 2D 数组创建选定元素的线程本地副本?(共享,私有,障碍:OPenMP)
- C++ 从名称数组创建对象
- 从数组创建 Mat 时,'cv::Mat' 和 'int' 类型不兼容
- 从 std::数组创建十六进制代表
- 在 C++ 结构内声明的数组 A[1] 创建多个实例
- 为多维数组创建内存空间
- 如何使用任何类型的数组创建模板类并为其设置值?
- 从字符串数组创建一个字符数组
- 是否可以在不为该数组创建变量的情况下将数组作为参数传递到函数中?
- 使用类定义数组创建C++类
- 使用具有唯一随机数的结构数组创建多个对象
- 谷歌测试:无法从字符数组创建字符串
- 从 1D 数组创建 2D 数组
- 无法通过一个单向链表数组创建邻接列表
- 如何使用数组创建标准::函数
- 在C++中,返回从本地字符数组创建的字符串是否会导致内存泄漏或未定义的行为