可以用数组参数从Fortran调用标量C函数吗?
我最近遇到了一个情况,我想从Fortran调用一个C函数,因为有一段有用的C代码。为了便于数组操作,我还希望能够使用数组参数调用此函数,但它只接受标量参数 在Fortran中,我们当然可以简单地将一个过程声明为可以用数组参数从Fortran调用标量C函数吗?,c,interop,fortran,fortran2003,fortran-iso-c-binding,C,Interop,Fortran,Fortran2003,Fortran Iso C Binding,我最近遇到了一个情况,我想从Fortran调用一个C函数,因为有一段有用的C代码。为了便于数组操作,我还希望能够使用数组参数调用此函数,但它只接受标量参数 在Fortran中,我们当然可以简单地将一个过程声明为elemental来实现这一点,并且可以使用bind(C)声明一个与C过程的接口。但是,由于C没有基本过程的概念,Fortran(2008)标准排除了这种组合: C1246基本程序不应具有BIND属性 那么,这个功能可以在Fortran中实现吗?经过一些搜索,我发现这是可能的,而且非常简单
elemental
来实现这一点,并且可以使用bind(C)
声明一个与C过程的接口。但是,由于C没有基本过程的概念,Fortran(2008)标准排除了这种组合:
C1246基本程序不应具有BIND属性
那么,这个功能可以在Fortran中实现吗?经过一些搜索,我发现这是可能的,而且非常简单,使用Fortran 2003和
iso_c_binding
内部模块;我想我应该在这里记录下来。带有bind
属性的接口仍然可以是纯的
,因此它可以在Fortran过程中引用,Fortran过程本身就是基本的
下面是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
如果一个C函数是纯函数,而它可能不是纯函数,有时很难理解。不纯元素可能很方便。+1表示不纯。目前看来,这个特性还没有得到广泛的编译器支持,但至少gfortran(4.7)已经实现了它。