2013-12-18 33 views
1

我試圖將FORTRAN程序中的單維數組傳遞給C.無法將數組從FORTRAN傳遞到C

C函數被調用,但它所保存的值是垃圾。但是,如果我嘗試使用整數變量調用相同的函數,我可以通過所需的值。任何人都可以幫我解決這個問題嗎?

我使用的代碼與此類似

文件:fortran_prog.f

program test 
    real*4 :: a(4) 
    data a/1,2,3,4/
    call test_func(a) 
end program test 

文件:c_prog.c

int test_func(double a[]) { 
    int i; 

    for(i=0;i<4;i++) { 
     printf("%f\n",a[i]); 
    } 

    return 0; 
} 
+0

這是什麼平臺和特定的編譯器? – wallyk

+0

我在Linux上運行它們。對於C程序,我正在使用gcc和FORTRAN我正在使用ifort – arunr

+4

在現代時代這樣做的方法是使用Fortran ISO C Binding。這是Fortran語言標準的一部分,並且使便攜式語言之間的連接成爲可能。檢查標籤http://stackoverflow.com/questions/tagged/fortran-iso-c-binding有很多例子。 –

回答

1

傳遞Fortran和C之間的陣列是一種非 - 平凡的問題。特定的C和Fortran編譯器很重要。

我看到的第一個問題是您指定double以匹配real*4。在幾乎所有的平臺上這肯定是無效的。聲明C函數爲:

int test_func (float *a) 

這可能在某些平臺上工作,雖然很多Fortran編譯器通過「陣列描述符」而不是該數組本身的地址。檢查Fortran編譯器的文檔。

+0

您正在調用一個返回int作爲子例程的函數。聲明你的C函數返回void。 – Anycorn

3
program test_Cfunc 

    use iso_c_binding 
    implicit none 

    interface 
     function test_func (a) bind (C, name="test_func") 
     import 
     integer (c_int) :: test_func 
     real (c_double), dimension (1:4), intent (in) :: a 
     end function test_func 
    end interface 

    real (c_double), dimension (1:4) :: a = [ 2.3, 3.4, 4.5, 5.6 ] 
    integer (c_int) :: result 

    result = test_func (a) 
    write (*, *) result 

end program test_Cfunc 

使用的Fortran的ISO C結合,解決方法是移植到來自相同供應商由Fortran編譯器的供應商支持對編譯器,或它們的組合。您不必瞭解特定編譯器的傳遞約定,也不需要處理Fortran編譯器的名稱修改(即由bindname子句覆蓋)。您可以使用interface塊向Fortran描述C例程,使用ISO C綁定中提供的Fortran種類值指定C類型。在「內在模塊」一章的gfortran手冊中有類型類型的列表。另請參閱「混合語言編程」一章。由於ISO C綁定是語言標準的一部分,因此這個文檔更通用,只有gfortran。