2015-02-24 84 views
-1

我想用C語言編寫fortran77中的'expokit'包。我已經安裝在我的Linux系統f2c上,並將zhpadm.f文件翻譯成zhpadm.c。我應該做些什麼來在C中求矩陣。我應該在主C程序中包含哪些文件?將Expokit翻譯爲C

如何將參數傳遞給C中的函數zhpadm()?我的問題是與2D數組。我不知道如何傳遞這些信息,我不知道如何傳遞複數。對於真正的1D陣列它的作品。

我正在使用gfortran和gcc。

+1

想要在C中使用這個例程的確切原因是什麼?請注意,f2c生成的C代碼很難閱讀,通常被認爲是不可維護的。它也取決於一個特殊的圖書館。考慮使用gfortran編譯包並使用Fortran C interop的標準設備從C中調用所需的例程,並使用包裝函數使接口更容易。 – 2015-02-24 13:43:08

+0

我想從C調用fortran子例程,但是我有2d數組的問題。我不知道如何通過他們和複雜的數字。對於真正的1D陣列它的作品。我還沒有嘗試過使用1d複雜數組。我正在使用complex.h in C – 2015-02-24 14:12:28

+1

調用Fortran版本應該比LOT更容易,而不是做一個好的翻譯。 – 2015-02-24 14:22:44

回答

1

爲了將數據傳遞到從C到Fortran的多維數組中,您必須瞭解Fortran陣列的佈局。

Fortran陣列由一系列存儲位置組成。假設你有一個Fortran子程序

subroutine foo(a,n,m) 
    real, intent(inout) :: a(n,m) 

這給你一個N * M數組。默認情況下,Fortran數組索引從1開始,因此A(1,1)引用第一個存儲位置處的第一個數組元素。然後元素依次爲A(1,1),A(2,1),A(3,1),...,A(N-1,1),A(N,1),A (1,2),A(2,2),...直到A(N,M)。

假設在C端有一個指向第一個元素的指針。讓我們假設這個指針是ap

然後,ap[0]要提到A(1,1)ap[1]A(2,1)等。一般情況下,如果你想參考A(I,J)對Fortran的一面,你必須參考ap[(i-1)+n*(j-1)]在C面。當然,在C面,它會更ideomatic使用從零開始的訪問中C.

所以,如果你想構建的Fortran數組,它看起來像

A = | 1 4 | 
    | 2 5 | 
    | 3 6 | 

你可以使用以下C代碼:

int n=3, m=2; 
    int count = 1, 
    for (i=0; i<n; i++) 
    { 
     for (j=0; j<m; j++) 
     { 
      ap[i+n*j] = count; 
      count ++; 
     } 
    } 

Fortran中的複數很容易 - 真實和虛擬部分位於兩個連續的存儲位置。你可以在你的程序中使用它。 COMPLEX * 16是用於雙精度複雜的舊的非標準形式。

圍繞zhpadm.f編寫包裝函數很有意義。使該功能綁定(C)並讓它爲zhpadm保留所需的工作區。

欲瞭解更多提示,請閱讀https://stackoverflow.com/tags/fortran-iso-c-binding/info