我想创建一个子程序,将函数作为输出返回。我怎样才能做到这一点?我将举例说明我认为它应该如何(我知道它写得不好)
module fun_out
contains
subroutine exponential(F,a)
interface, intent(out)
function f(x)
real, intent(in)::x
real :: f(2)
end function
end interface
real,intent(in):: a
F=exp(a*x)
end subroutine exponential
end module
有了这个,我应该从输出中的指数族中获取一个函数。
答案 0 :(得分:3)
您必须返回一个函数指针。这可以在Fortran 2003中完成。
procedure(name_of_interface), pointer :: f
但是,你必须不要指望完整的词法范围闭包,只是纯粹的指针。
您必须将程序准备为正常的外部,模块或F2008甚至内部程序(有一些限制)并且只需指向它:
f => my_function
在您的情况下,您有参数a
,并且您似乎想要使用捕获的闭包变量。在Fortran中是不可能的。您必须每次都将它传递给函数,或者我们使用Functor模式(包含捕获的参数的派生类型),或者使用内部过程(但这仅在其主机过程中有效)。
答案 1 :(得分:2)
您基本上可以通过定义仿函数对象来执行此操作(如Vladimir's answer中所述)。它们有一个返回值的特定函数(例如getvalue()
),并且根据它们的初始化,它们可能返回自定义函数值。
以下示例详细说明了这一点。一般仿函数在functor_module
中定义,在expfunc_module
中导出了指数函数族的具体实现。然后,在主程序中,然后使用指数中的不同前因子初始化不同的实例,并可以使用它们的getvalue()
方法来获取适当的函数值。:
module functor_module
implicit none
integer, parameter :: wp = kind(1.0d0)
type, abstract :: functor
contains
procedure(getvalue_iface), deferred :: getvalue
end type functor
interface
function getvalue_iface(self, xx) result(yy)
import
class(functor), intent(in) :: self
real(wp), intent(in) :: xx
real(wp) :: yy
end function getvalue_iface
end interface
end module functor_module
module expfunc_module
use functor_module
implicit none
type, extends(functor) :: expfunc
real(wp) :: aa
contains
procedure :: getvalue
end type expfunc
contains
function getvalue(self, xx) result(yy)
class(expfunc), intent(in) :: self
real(wp), intent(in) :: xx
real(wp) :: yy
yy = exp(self%aa * xx)
end function getvalue
end module expfunc_module
program test_functors
use expfunc_module
implicit none
type(expfunc) :: func1, func2
real(wp) :: xx
func1 = expfunc(1.0_wp)
func2 = expfunc(2.0_wp)
xx = 1.0_wp
print *, func1%getvalue(xx) ! gives exp(1.0 * xx) = 2.718...
print *, func2%getvalue(xx) ! gives exp(2.0 * xx) = 7.389...
end program test_functors