经过一番搜索,我发现使用 Fortran 2003 和iso_c_binding
内部模块,这既可行又非常简单;我想我应该在这里记录一下。具有该bind
属性的接口仍然可以存在pure
,因此可以在本身的 Fortran 过程中引用它elemental
。
以下是 C99 宏的简短示例,isnan
如果其参数为 NaN,则返回非零整数值。当然,这也可以用于任何没有副作用的用户定义的 C/C++ 函数。
elemental function isnan(val)
use, intrinsic :: iso_c_binding
implicit none
real(c_double), intent(in) :: val
logical(c_bool) :: isnan
interface
pure function isnan_C(val) bind(C, name = 'isnan')
import
! Pass the parameter by value:
real(c_double), value, intent(in) :: val
integer(c_int) :: isnan_C
end function
end interface
isnan = isnan_C(val) /= 0_c_int
end function
使用具有一些 NaN 值的数组的示例输出:
program main
use, intrinsic :: iso_c_binding
implicit none
real(c_double) :: nan(2,2) = 0.
nan(:,2) = nan(1,1)/0.
write(*,'(4F6.2 / 4L6)') nan, isnan(nan) ! Output: 0.00 0.00 NaN NaN
! F F T T
end program