如何在fortran 90中实现这一目标?我有一个例程接受一个函数
subroutine foo(bar, mysub)
integer, intent(in) :: bar
interface
subroutine mysub(x)
integer :: x
end subroutine
end interface
call mysub(bar)
end subroutine
现在我希望例程是可选的
subroutine foo(bar, mysub)
integer, intent(in) :: bar
interface
subroutine mysub(x)
integer :: x
end subroutine
end interface
optional :: mysub
call mysub(bar)
end subroutine
现在,如果mysub是标准变量var
,我可以做类似
if (present(var)) then
l_var = var
else
l_var = <default value>
endif
但据我所知,我无法对可选的子程序执行相同的操作。在实践中,这是不可能的
subroutine foo(bar, mysub)
integer, intent(in) :: bar
interface
subroutine mysub(x)
integer :: x
end subroutine
end interface
optional :: mysub
if (present(mysub)) then
l_mysub = mysub
else
l_mysub = default
endif
call mysub(bar)
end subroutine
因为您无法声明l_mysub。有可能通过一些我不知道的技巧吗?是的,我当然可以做到
if (present(mysub)) then
call mysub(bar)
else
call default(bar)
endif
但我的情况更复杂,我不得不在任何地方进行检查。考虑一下,我可以通过三个可选的子程序。
答案 0 :(得分:1)
我的第一个想法是使用程序指针,但后来我注意到你指定了fortran 90,所以这不是一个选项。
如何为原始foo
创建一个包装器子例程,如果指定了子例程,则使用给定的子例程调用它,或者使用default
?像这样(未经测试):
subroutine foo_wrap(bar, mysub)
integer, intent(in) :: bar
interface
subroutine mysub(x)
integer :: x
end subroutine mysub
end interface
optional :: mysub
if (present(mysub)) then
call foo(bar, mysub)
else
call foo(bar, default)
endif
end subroutine foo_wrap
我认为,使用多个可选子程序可能会变得有点复杂,但并非不可能。