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

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

在下面的示例中, subr1()使用explicit-shape,并且工作正常,但subr2()使用deferred-shape并导致段错误。 这个问题表明需要一个显式接口来从另一个Fortran子例程调用subr2() ,但是我试图从C调用。这样做是不可能的吗?

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

test_array_c.c

 #include  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 

命令行构建/运行

 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) 

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

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