2014-05-10 55 views
0

我只是用Fortran的開始,我有一個程序和功能如何在fortran中調用bind-C函數?

PROGRAM multiplication 
    implicit none 
    real :: A1 

    !A1 = mult(2, 3) 
    !write(*,1) A1 
    1 format(f8.8) 
END PROGRAM multiplication 

REAL FUNCTION mult(a, b) BIND(C, name='foomult') 
    real,value :: a,b 
    mult = a * b 
END FUNCTION 

我已經得到了功能通過JNA在java中工作,但是當我嘗試從FORTRAN中調用MULT主程序,我得到了大量的編譯錯誤(如果你願意,我可以提供它們)。我有一種感覺,它一定是明顯的,但我無法在任何地方找到解決方案。綁定函數不打算從非外部代碼中調用?或者我只是對函數語法有一個很差的理解?

+0

另請參見http://stackoverflow.com/q/21123278/3157076 – francescalus

+0

使用帶有標籤格式語句的Fortran 2003有點奇怪。 –

回答

1

對於主程序,編譯器不會「知道」函數的屬性,即函數的類型及其參數。您的函數使用「高級」參數屬性value,因此有必要以某種方式向調用者聲明屬性。使已知呼叫者這些屬性的最簡單方法是將功能分爲模塊和use該模塊由一個使用它的程序或過程:

module MyModule 

contains 

FUNCTION mult(a, b) BIND(C, name='foomult') 
    use iso_c_binding 
    real (c_float) ,value :: a,b 
    real (c_float) :: mult 
    mult = a * b 
END FUNCTION 

end module MyModule 

PROGRAM multiplication 
    use MyModule 
    implicit none 
    real :: A1 

    A1 = mult(2.0, 3.0) 
    write(*,*) A1 
END PROGRAM multiplication 

我也宣佈在該函數的變量與C兼容。至少在我的計算機上使用gfortran時,它們與簡單實際一樣,所以它們與主程序中的調用兼容。兼容性可以通過編寫電話mult (2.0_c_float, 3.0_c_float)來保證。

+1

即使沒有「價值」,也需要明確的接口:「綁定」是一個充分的條件。 – francescalus