2013-11-27 62 views
2

我需要將一個動態數組從C++傳遞給Fortran。我做了大量的研究,將我認爲應該工作的一個例子放在一起,但事實並非如此。程序應該在C++程序中創建一個數組,將該數組的指針傳遞給Fortran例程,將C指針轉換爲Fortran指針,然後在Fortran端打印該數組。爲什麼試圖將指針從C++傳遞到Fortran不起作用?

我的C++主程序:

using namespace std; 

extern "C" { 
    void cinterface(int*,int*); 
} 

int main() 
{ 
    int carray[]={0,1,2,3,4}; 
    int carray_siz=5; 

    cinterface(&carray_siz,carray); 

    return 0; 
} 

我的Fortran程序:

module fortmod 

    use ISO_C_BINDING 

    implicit none 

contains 

    subroutine cinterface(carray_siz,carray_ptr) bind(C) 

     implicit none 

     integer(c_int), intent(in) :: carray_siz 
     type(c_ptr), intent(in) :: carray_ptr 

     integer(c_int), pointer :: pfarray(:) => NULL() 

     call C_F_POINTER(carray_ptr,pfarray,[carray_siz]) 

     print *, pfarray 

    end subroutine cinterface 

end module fortmod 

我建立這個爲:

gfortran -c fortmod.f90 
g++ main.cpp fortmod.o -lgfortran 

但是當我運行它,而不是打印的陣列它說:

Segmentation fault (core dumped) 

我是新來的指針的想法,所以我想我不理解他們如何正確工作。你能指出爲什麼我在運行時遇到這種內存錯誤嗎?

回答

1

從gfortran手冊:

如果一個指針是一個僞參數一個可互操作的過程,通常必須是使用VALUE屬性聲明的 。 void *匹配TYPE(C_PTR),VALUE,而TYPE(C_PTR)單獨匹配void **。

我的Fortran程序正在尋找指針的地址,而不是指針指向的地址。所以如果我修改C++端到這個:

using namespace std;

extern "C" { 
    void cinterface(int*,int**); 
} 

int main() 
{ 
    int carray[]={0,1,2,3,4}; 
    int carray_siz=5; 

    cinterface(&carray_siz,&carray); 

    return 0; 
} 

重新構建並重新運行,我現在得到:

0  1  2  3  4 

預期。

4

當然要傳遞數組大小如int,大小的地址:

extern "C" { 
    void cinterface(int,int*); 
} 

cinterface(carray_siz,carray); 
+0

但Fortran通過引用傳遞參數,所以我想我其實是想傳遞地址,對吧? – rks171

+0

在這種情況下,您想要傳遞數組地址的*地址*(即它是引用以及'carray_siz'引用) –

相關問題