是否可以从C / C ++调用Fortran子例程,其中一个Fortran参数是延迟形状数组? (希望我正确使用“延迟形状”一词。)
在下面的示例中,subr1()
使用显式形状,并且工作正常,但subr2()
使用延迟形状并导致段错误。 This question表示需要一个显式接口来从另一个Fortran子例程调用subr2()
,但我正在尝试从C调用。这样做是不可能的?
在实际问题中,数组的长度会更复杂 - 这就是为什么在理想的世界中,我想使用延迟形状版本。 (当然,在一个理想的世界里,我根本不会混合使用Fortran和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);
}
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)
答案 0 :(得分:1)
该术语是“假定形状”数组。作为编译器实现的实际问题,它可能被传递为某种不一致的结构C.这解释了分段错误。
在这个时代,我建议通过ISO C绑定混合Fortran和C.但这不会有帮助,因为ISO C绑定不支持假定形状数组,或者至少不支持Fortran 2003版本。