2012-11-22 35 views
0

我正在使用C++和Fortran代碼。 C++代碼需要調用Fortran子例程。 Fortran子例程的一個參數具有Fortran類型complex在C++和Fortran之間傳遞複數數組代碼

C++代碼位於一個文件中,Fortran代碼子例程位於另一個文件中。我在64位GNU/Linux系統上使用gccgfortran

這裏是示出的Fortran子程序聲明一個片段(和一些附加行):

SUBROUTINE minp (AMP,L,L2,FMINP,PHI) 
    REAL*4 AMP(L),FMINP(L) 
    COMPLEX PHI(L) 

在C++文件,我明白傳遞給Fortran代碼參數需要通過引用傳遞,並而不是價值。 Fortran子程序在使用extern關鍵字的C++代碼中(位於源代碼文件的頂部)被聲明爲函數。

extern "C" 
{ 
minp_ (float *amp, int &L, int &L2, float *fminp, complex *phi); 

} 

但是,函數的最後一個參數是複數C數組。如何可能:

  1. 爲C/C++中的複雜數組分配內存以作爲phi參數傳入?
  2. 將數組作爲參數傳遞給Fortran子例程,以便內存可以被Fortran代碼使用?

回答

3

對於連接C(和C++通過extern C)和Fortran,我推薦使用Fortran的ISO C綁定。它提供了複雜的類型,C_FLOAT_COMPLEX,C_DOUBLE_COMPLEX和C_LONG_DOUBLE_COMPLEX,以匹配C的類型。通過使用ISO C綁定並編寫一個Fortran接口聲明來匹配C代碼,您將指示Fortran編譯器匹配C編譯器的調用約定。如果您使用帶ISO C綁定的複雜類型,則處理數組與float/double/long double數組沒有任何區別。 gfortran手冊在章節混合語言編程中有例子,並且描述了章節內部模塊中ISO C Binding的類型和內在過程。

+0

謝謝,M.S.B.這確實是一種可行的方式。 –