我有一个接受int指针的C函数。
void setCoords(int *coords)
coords是阵列。
在Fortran中,我尝试使用:
调用此函数integer, dimension(10) :: coords
call setCoords(coords)
我收到一个编译错误,指出违反了虚拟和实际参数的形状匹配规则。请注意,当我使用GNU编译器时,此代码用于编译时没有任何问题。切换到英特尔编译器后,我遇到了这个问题。
答案 0 :(得分:1)
您需要定义一个interface
,将参数声明为C_PTR
。英特尔Fortran 19.0 manual给出了以下使用原型
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))
...