【发布时间】:2016-03-23 03:55:12
【问题描述】:
我正在使用 iso-c 绑定和模块/接口等在 fortran 和 C 之间桥接一些遗留代码。
通常,当将一个 fortran 数组传递给 C 时,我只需将其复制到另一个具有正确 iso-c 绑定类型的数组中。然而,一些代码需要我传递一个大(多 GB)数组。在这种情况下,复制它是不明智的。此外,由于它来自第 3 方代码,因此也无法更改无用 real(c_float) 的 fortran 数组的类型。
但是,如果底层的 fortran 数组与基于 C 浮点的 API 不兼容,我很乐意抛出异常或编译失败。
有没有办法在编译时(或运行时)检查默认 real 是否与 C float 或 double 兼容?
如果重要的话,我正在使用 intel fortran 和 C 编译器。
【问题讨论】:
-
为什么说复制多 GB 数组是不明智的?目标是什么类型的硬件?
-
@wallyk 主要是因为我已经接近机器上的内存限制。在已用内存中再添加 4GB 会导致应用程序崩溃——或将我推入交换状态——其中任何一种都是不可接受的。
-
我建议查看 Fortran 编译器手册。然而,在过去(又名 Fortran 77),REAL 也是
REAL*4,而不是双精度的REAL*8— 那是双精度吗? — 因此,Fortran REAL 与 C 浮点数相同的可能性非常高。如果由于某种意外或设计,Fortran REAL 是 Cdouble,那么您将能够使用未复制的数组,不是吗? AFAICR,如果你在 C 代码中修改数组,它也会在调用函数中被改变——就像 C 一样。 -
你可以试试写
real (OriginalArray, c_float)。如果OriginalArray与c_float属于同一类型,则可能希望将内在real写入数组之后。如果它是不同的类型,那么它会生成c_float类型的临时副本。也许会有足够的内存...... -
@JonathanLeffler 在过去的日子里,使用这些简单假设不正确的奇怪机器的几率比今天(各种 24 位或 48 位机器和其他机器)大得多。
标签: c fortran fortran-iso-c-binding