在fortran中调用C函数,其中参数是指针

时间:2018-04-14 04:00:20

标签: c fortran

我有一个接受int指针的C函数。

void setCoords(int *coords)

coords是阵列。

在Fortran中,我尝试使用:

调用此函数
integer, dimension(10) :: coords
call setCoords(coords)

我收到一个编译错误,指出违反了虚拟和实际参数的形状匹配规则。请注意,当我使用GNU编译器时,此代码用于编译时没有任何问题。切换到英特尔编译器后,我遇到了这个问题。

1 个答案:

答案 0 :(得分:1)

您需要定义一个interface,将参数声明为C_PTR。英特尔Fortran 19.0 manual给出了以下使用原型

调用C函数的示例
int C_Library_Function(void* sendbuf, int sendcount, int *recvcounts);

首先,定义一个模块,例如:

module ftn_C_2
       interface
         integer (C_INT) function C_Library_Function &
         (sendbuf, sendcount, recvcounts) &
            BIND(C, name='C_Library_Function’)
            use, intrinsic :: ISO_C_BINDING 
            implicit none
            type (C_PTR), value :: sendbuf
            integer (C_INT), value :: sendcount
            type (C_PTR), value :: recvcounts
         end function C_Library_Function
       end interface
    end module ftn_C_2

然后,在调用函数中,按如下方式使用它:

use, intrinsic :: ISO_C_BINDING, only: C_INT, C_FLOAT, C_LOC
    use ftn_C_2
    ...
    real (C_FLOAT), target :: send(100)
    integer (C_INT) :: sendcount
    integer (C_INT), ALLOCATABLE, target :: recvcounts(100)
    ...
    ALLOCATE( recvcounts(100) )
    ...
    call C_Library_Function(C_LOC(send), sendcount, &
    C_LOC(recvcounts))
    ...