gpt4 book ai didi

c - 通过 ISO_C_BINDING 传递 Fortran 数组

转载 作者:太空宇宙 更新时间:2023-11-04 02:49:19 30 4
gpt4 key购买 nike

我正在尝试获取 Fortran 代码库以使用 ISO_C_BINDING 调用 C 库调用,但我在传递 Fortran 数组时遇到了问题。

我创建了一个简单示例来说明我的问题。

主.f90

program main
use iso_c_binding
implicit none

interface
subroutine stuff(s,d) bind(c,name='doStuff')
import :: c_char
import :: c_ptr
import :: c_double

character(c_char), value :: s
type(c_ptr), value :: d
end subroutine stuff
end interface

character(len=1) ::c1
real, allocatable :: d1(:)

c1 = 'a'
allocate ( d1(0:10) )

d1(0) = 2.0
d1(1) = 2.5
d1(2) = 3.0
d1(3) = 4.0

write (*,*) d1

call stuff(c1,c_loc(d1))

end program main

函数.c

//a function
int doStuff (char c, double* w)
{
printf("%c\n",c);
printf("%d %d %d %d\n",w[0], w[1], w[2], w[3]);
return 1;
}

编译行

icc -c func.c
ifort -o magic.go main.f90 func.o

输出

2.000000       2.500000       3.000000       4.000000      0.0000000E+00    0.0000000E+00  0.0000000E+00  0.0000000E+00  0.0000000E+00  0.0000000E+00  0.0000000E+00
a
0 -1938231792 1 1

char 被正确传递但数组不是,我不知道如何更正它。我见过的例子建议改变

double* w

void* w

但我不能那样做,因为我不能更改库代码来使它工作。我刚刚尝试创建一个新函数来将 void* 转换为 double* 无效:(。同样,更改数组以使其不可分配也是不可行的。

想法?

最佳答案

d1 的声明有问题。更好的是

real(c_double), allocatable, target :: d1(:)

也就是说:它必须是正确的类型才能与 C 的 double 互操作;要成为 c_loc 的参数,它必须具有 targetpointer 属性。

此外,如 Mahonri Moriancumer 所述,您的 printf 格式不适合 double。而且,可能值得考虑将 stuff 作为函数而不是子例程。

关于c - 通过 ISO_C_BINDING 传递 Fortran 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23794106/

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