2014-02-12 26 views
1

我寫了一套子程序,並將它們編譯成一個庫。這些子程序基於一些定義的函數(x,y)。目前這被埋藏在圖書館例程中 - 但是我希望能夠將任何函數(x,y)傳遞到這個庫中 - 這可能嗎?多謝你們!使用fortran將函數傳遞到子例程中。

+1

是的,傳遞一個過程/函數指針。請參閱http://stackoverflow.com/questions/8612466/how-to-alias-a-function-name-in-fortran –

回答

1
module ExampleFuncs 

    implicit none 

abstract interface 
    function func (z) 
     real :: func 
     real, intent (in) :: z 
    end function func 
end interface 


contains 


subroutine EvalFunc (aFunc_ptr, x) 

    procedure (func), pointer :: aFunc_ptr 
    real, intent (in) :: x 

    write (*, *) "answer:", aFunc_ptr (x) 

end subroutine EvalFunc 


function f1 (x) 
    real :: f1 
    real, intent (in) :: x 

    f1 = 2.0 * x 

end function f1 


function f2 (x) 
    real :: f2 
    real, intent (in) :: x 

    f2 = 3.0 * x**2 

end function f2 

end module ExampleFuncs 


program Func_to_Sub 

    use ExampleFuncs 

    implicit none 

    procedure (func), pointer :: f_ptr => null() 

    f_ptr => f1 
    call EvalFunc (f_ptr, 2.0) 

    f_ptr => f2 
    call EvalFunc (f_ptr, 2.0) 

    stop 

end program Func_to_Sub 
+0

這不需要用指針來完成。當使用一致的接口聲明相應的僞參數時,您可以直接傳遞過程名稱。但指針也起作用。 –

+0

這也可以在沒有抽象接口的情況下完成,只需在EXTERNAL中聲明與該函數相對應的參數(據我所知,通過參數傳遞一個過程是一個非常古老的Fortran特性,例如F66中已有)。當然,asbtract接口(F2003)是一個更安全的解決方案,可避免將錯誤的過程傳遞給EvalFunc。 –

+0

謝謝你們。所以在上面的例子中,函數f1和f2可以在程序中定義?也就是說,如果模塊ExampleFuncs是一個庫/黑盒,就用戶而言,他們可以在程序或單獨的模塊中定義函數?並調用ExampleFuncs。那有意義嗎? – user2350366

相關問題