我寫了一套子程序,並將它們編譯成一個庫。這些子程序基於一些定義的函數(x,y)。目前這被埋藏在圖書館例程中 - 但是我希望能夠將任何函數(x,y)傳遞到這個庫中 - 這可能嗎?多謝你們!使用fortran將函數傳遞到子例程中。
回答
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
這不需要用指針來完成。當使用一致的接口聲明相應的僞參數時,您可以直接傳遞過程名稱。但指針也起作用。 –
這也可以在沒有抽象接口的情況下完成,只需在EXTERNAL中聲明與該函數相對應的參數(據我所知,通過參數傳遞一個過程是一個非常古老的Fortran特性,例如F66中已有)。當然,asbtract接口(F2003)是一個更安全的解決方案,可避免將錯誤的過程傳遞給EvalFunc。 –
謝謝你們。所以在上面的例子中,函數f1和f2可以在程序中定義?也就是說,如果模塊ExampleFuncs是一個庫/黑盒,就用戶而言,他們可以在程序或單獨的模塊中定義函數?並調用ExampleFuncs。那有意義嗎? – user2350366
- 1. 將C++函數指針傳遞給Fortran子例程
- 2. 使用ctypes將python字符串傳遞給Fortran子例程
- 3. Fortran傳遞語句函數到函數
- 4. 將常用塊數組大小傳遞給Fortran中的子例程
- 5. 如何在Fortran中的子例程中使用函數?
- 6. 將複數組的實數部分傳遞給fortran中的子例程
- 7. Fortran 90 - 將主子程序的值傳遞給函數和其他子程序
- 8. 將fortran 77函數傳遞給C/C++
- 9. 將一組顯式字符串傳遞給Fortran子例程
- 10. Fortran:將任意「結構」傳遞給模塊子例程
- 11. 如何將fortran指針傳遞給子例程?
- 12. Fortran:如何將類型變量傳遞給子例程
- 13. 如何在Fortran中將子例程名稱作爲參數傳遞?
- 14. 如何在Fortran類中將子例程名稱作爲參數傳遞
- 15. 傳遞函數作爲使用接口的子例程的參數在Plato Fortran中不起作用90
- 16. 將可分配數組傳遞給Fortran中的MPI子程序
- 17. FORTRAN:分段錯誤,當將數組參數傳遞給子例程
- 18. Fortran:將相同的數組作爲兩個僞參數傳遞給子例程
- 19. 函數如何在Fuction參數中傳遞?用例子程序?
- 20. 在Fortran中從外部類傳遞子例程
- 21. 如何將可選參數從Fortran子例程傳遞給R封裝器
- 22. Fortran |將函數作爲其他函數的參數傳遞
- 23. Perl如何將數據傳遞到模塊中的子例程
- 24. C++傳遞函數到函子中
- 25. 子程序參數沒有從Python正確傳遞到Fortran
- 26. 如何在Fortran 90/95中使用Fortran 77子例程?
- 27. 將數組作爲函數參數傳遞給Fortran
- 28. 將可分配數組的子數組傳遞給子例程
- 29. 在fortran子程序中傳遞多維數組
- 30. 將MailItem傳遞到函數
是的,傳遞一個過程/函數指針。請參閱http://stackoverflow.com/questions/8612466/how-to-alias-a-function-name-in-fortran –