使用延迟形状数组从C调用Fortran

时间:2014-01-28 04:59:34

标签: c arrays fortran deferred

是否可以从C / C ++调用Fortran子例程,其中一个Fortran参数是延迟形状数组? (希望我正确使用“延迟形状”一词。)

在下面的示例中,subr1()使用显式形状,并且工作正常,但subr2()使用延迟形状并导致段错误。 This question表示需要一个显式接口来从另一个Fortran子例程调用subr2(),但我正在尝试从C调用。这样做是不可能的?

在实际问题中,数组的长度会更复杂 - 这就是为什么在理想的世界中,我想使用延迟形状版本。 (当然,在一个理想的世界里,我根本不会混合使用Fortran和C.)

test_array_c.c

#include <malloc.h>

extern void subr1_(int*, int*);
extern void subr2_(int*, int*);

int main(int argc, char **argv){

  int N,i;
  int *data;

  // create an array
  N=3;
  data=(int*)malloc(N*sizeof(int));
  for (i=0;i<N;i++) data[i]=i;

  // pass array to fortran functions
  subr1_(&N,data);
  subr2_(&N,data);

  // free
  free(data);
}

test_array_f90.f90

subroutine subr1(n,data)
  implicit none

  integer,intent(in) :: n
  integer,intent(in) :: data(n)
  integer :: i

  do i=1,n
    print*, data(i)
  enddo

end subroutine

subroutine subr2(n,data)
  implicit none

  integer,intent(in) :: n
  integer,intent(in) :: data(:)
  integer :: i

  do i=1,n
    print*, data(i)
  enddo

end subroutine

命令行build / run

user@host:~$ gcc -g -O0 -c test_array_c.c
user@host:~$ gfortran -g -O0 -c test_array_f90.f90
user@host:~$ gcc -o test_array test_array_c.o test_array_f90.o -lgfortran
user@host:~$ ./test_array
           0
           1
           2
Segmentation fault (core dumped)

1 个答案:

答案 0 :(得分:1)

该术语是“假定形状”数组。作为编译器实现的实际问题,它可能被传递为某种不一致的结构C.这解释了分段错误。

在这个时代,我建议通过ISO C绑定混合Fortran和C.但这不会有帮助,因为ISO C绑定不支持假定形状数组,或者至少不支持Fortran 2003版本。