gpt4 book ai didi

从 c 调用 fortran 函数时无法正确传递数组

转载 作者:行者123 更新时间:2023-11-30 17:51:50 24 4
gpt4 key购买 nike

我需要从c调用一个fortran函数,其中一个参数是一个数组,c代码是:

float x[18] = {...};
pot = f_(x);

其中 x 是一个包含 18 个元素的 float 组,fortran 代码为

function f(x,xc,im) result(pot)
real,dimension(1:18),intent(in)::x
real,dimension(:),optional,intent(in)::xc
integer,optional,intent(in)::im
do i=1,18
write (*,*) x(i)
enddo
...
end function f

fortran函数编写的x数组与c代码中的元素值不同,有人可以帮助我吗?我使用的编译器是 icc 和 ifort,我使用 ifort 来链接 *.o 文件。谢谢

最佳答案

带有可选参数的 Fortran 子例程不能与 C 互操作。调用方必须在不传递可选参数时以某种方式发出信号。一些 Fortran 编译器会传递空指针(例如 this thread in the GNU Fortran mailing list ]),但有些编译器的行为可能完全不同。

无论如何,我强烈建议在 Fortran 和 C 之间进行互操作时在 Fortran 端使用 bind(C)。(请参阅 引用资料中的一些参数 here )。您的 Fortran 代码将如下所示:

module test
use iso_c_binding
implicit none

integer, parameter :: rp = c_float

contains

function ff(xx) result(pot) bind(c)
real(rp), intent(in) :: xx(18)
real(rp) :: pot

integer :: ii

do ii = 1, 18
write(*,*) xx(ii)
end do
pot = -1.0_rp

end function ff

end module test

在 C 语言中你可以这样写:

#include <stdio.h>

float ff(float *);

int main()
{

float xx[18], res;
int ii;

for (ii = 0; ii < 18; ++ii) {
xx[ii] = (float) ii;
}
res = ff(xx);
printf("Result: %f\n", res);
}

当您现在在 Fortran 端指定可选时,您至少会收到 gfortran 的错误消息。奇怪的是,ifort 没有给出任何错误消息,但这并不一定意味着它的行为是明确定义的。

关于从 c 调用 fortran 函数时无法正确传递数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16502231/

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