将Fortran整数数组传递给C子例程仅传递第一个元素

我试图将一个整数数组从Fortran传递给C,但我只能传递数组的第一个元素。

我有下面的测试程序再现错误。 我哪里错了?

program test use foo integer (kind=c_int), allocatable :: hgmu_dose(:) allocate (hgmu_dose(0:10)) HGMU_dose(0)=22 HGMU_dose(1)=2 HGMU_dose(2)=3 HGMU_dose(3)=4 HGMU_dose(4)=5 HGMU_dose(5)=6 HGMU_dose(6)=7 HGMU_dose(7)=8 HGMU_dose(8)=9 HGMU_dose(9)=10 HGMU_dose(10)=11 print *, "HGMU_dose=", hgmu_dose call test_interface(hgmu_dose) end program module foo use ISO_C_Binding implicit none interface subroutine test_interface(dose) bind(C,name="INTERFACE") import :: c_int import :: c_double import :: c_char integer (kind=c_int), allocatable :: dose(:) end subroutine end interface end module foo 

 #include "interface.h" namespace interface { extern "C" void INTERFACE (int dose[NDIM]) { for (int i = 0; i < NDIM; i++) cout << " dose[" << i << "] = " << dose[i] << endl; } } 

这里有几个问题。

第一个是你对test_interface接口的定义。 您不需要或不需要allocatable关键字。

 subroutine test_interface(dose) bind(C,name="INTERFACE") import :: c_int integer (kind=c_int) :: dose(:) end subroutine 

第二个是iso_c_binding将通过引用传递。 因此,当您在C中定义函数时,它应该接受指向数组的指针:

 void INTERFACE (int *dose[NDIM]) 

最后作为旁注,您不必将Fortran数组定义为从0开始。您可以从1开始正常使用Fortran。