Mic*_*son 2 c fortran fortran-iso-c-binding
我正在使用iso-c绑定和模块/接口等在fortran和C之间桥接一些遗留代码.
通常,当将fortran数组传递给C时,我只需将其复制到另一个正确的iso-c-binding类型的数组中.但是有些代码要求我传递一个大的(多GB)数组.在这种情况下复制它是不明智的.此外,由于它来自第三方代码,real(c_float)因此无法更改fortran数组的类型.
但是我很乐意抛出异常,或者如果底层fortran数组与基于C float的API不兼容,则无法编译.
有没有办法检查默认值real是否与C兼容float或double在编译时(或运行时)?
如果重要的话,我正在使用intel fortran和C编译器.
默认REAL类型与可与floatC语言互操作的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
Run Code Online (Sandbox Code Playgroud)
要么
IF (C_FLOAT /= KIND(1.0)) &
ERROR STOP 'Default REAL isn''t interoperable with FLOAT!!'
Run Code Online (Sandbox Code Playgroud)
如果Fortran处理器没有与其互操作的REAL类型,则C_FLOAT本身可能具有负值.
(对于某些15.0.x版本的ifort,以下内容可用于编译时检查变体:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
567 次 |
| 最近记录: |