0

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

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

其中 x 是具有 18 个元素的浮点数组,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 文件。谢谢

4

1 回答 1

0

带有可选参数的 Fortran 子例程不能与 C 互操作。调用方必须在不传递可选参数时以某种方式发出信号。一些 fortran 编译器会传递一个空指针(参见例如GNU Fortran 邮件列表中的这个线程]),但有些可能表现完全不同。

无论如何,我强烈建议bind(C)在 Fortran 和 C 之间进行互操作时使用 Fortran 端。(请参阅此处的一些论点)。您的 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);
}   

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

于 2013-05-12T07:11:47.237 回答