gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:19:33 24 4
gpt4 key购买 nike

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

void setCoords(int *coords)

其中 coords 是一个数组。

在 Fortran 中,我尝试使用以下方法调用此函数:

integer, dimension(10) :: coords
call setCoords(coords)

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

最佳答案

您需要定义一个接口(interface),将参数声明为C_PTR。英特尔Fortran 19.0 manual给出以下使用原型(prototype)调用 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))
...

关于在 Fortran 中调用 C 函数,其中参数是指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49827756/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com