0

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;
  }
}
4

1 に答える 1

0

ここにはいくつかの問題があります。

1 つ目は、test_interface インターフェースの定義にあります。allocatableキーワードは必要ありません。

subroutine test_interface(dose) bind(C,name="INTERFACE")

  import :: c_int

  integer (kind=c_int) :: dose(:)

end subroutine

2 つ目は、iso_c_binding参照渡しです。したがって、C で関数を定義するときは、配列へのポインターを受け入れる必要があります。

void INTERFACE (int *dose[NDIM])

最後に、Fortran 配列を 0 から始まるように定義する必要はありません。通常、Fortran は 1 から開始して使用できます。

于 2014-03-10T21:11:24.633 に答える