Вызов фортрана из C с отложенным массивом формы

Можно ли вызвать подпрограмму Fortran из C / C ++, где один из аргументов Fortran является массивом отложенной формы? (Надеюсь, я правильно использую термин «отсроченная форма».)

В приведенном ниже примере subr1() использует явную форму и работает отлично, но subr2() использует отложенную форму и вызывает segfault. Этот вопрос указывает, что требуется явный интерфейс для вызова subr2() из другой подпрограммы Fortran, но я пытаюсь позвонить из 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 

assembly / запуск командной строки

 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. Это объясняет ошибку сегментации.

В эту эпоху я рекомендую смешивать Fortran и C через привязку ISO C. Но это не поможет, потому что массивы предполагаемых форм не поддерживаются привязкой ISO C или, по крайней мере, не версией Fortran 2003.