gpt4 book ai didi

c - 如何检查 fortran real 是否与 C float 兼容?

转载 作者:行者123 更新时间:2023-12-02 09:27:48 25 4
gpt4 key购买 nike

我正在使用 iso-c 绑定(bind)和模块/接口(interface)等在 Fortran 和 C 之间桥接一些遗留代码。

通常,当将 fortran 数组传递给 C 时,我只需将其复制到正确 iso-c 绑定(bind)类型的另一个数组中。然而,有些代码要求我传递一个大(多 GB)数组。在这种情况下,复制它是不明智的。另外,由于它来自第 3 方代码,因此更改 fortran 数组的类型 no use real(c_float) 也是不可能的。

但是,如果底层 fortran 数组与基于 C 浮点的 API 不兼容,我很乐意抛出异常或无法编译。

有没有办法在编译时(或运行时)检查默认的 real 是否与 C floatdouble 兼容?

如果重要的话,我正在使用 intel fortran 和 C 编译器。

最佳答案

默认 REAL 类型与 C 中可与 float 互操作的 REAL 类型之间的比较只是简单的整数比较。

您可以使此比较触发编译错误或运行时错误。

USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_FLOAT    

! -99 is never a valid kind - so this will fail at compile time
! if the test condition is false.
REAL(MERGE(KIND(1.0), -99, C_FLOAT == KIND(1.0)) :: dummy

IF (C_FLOAT /= KIND(1.0))  &
ERROR STOP 'Default REAL isn''t interoperable with FLOAT!!'

如果 Fortran 处理器没有与其互操作的 REAL 类型,C_FLOAT 本身可能具有负值。

(对于 ifort 的某些 15.0.x 版本,以下内容可用于编译时检查变体:

USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_FLOAT
INTEGER, PARAMETER :: dummy_rk = MERGE(C_FLOAT, -99, KIND(1.0) == C_FLOAT)
! -99 is never a valid kind - so this will fail at compile time
! if the test condition is false.
REAL(dummy_rk) :: dummy

关于c - 如何检查 fortran real 是否与 C float 兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36169555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com