gpt4 book ai didi

fortran - Fortran 90 中的可选子例程

转载 作者:行者123 更新时间:2023-12-02 16:46:17 27 4
gpt4 key购买 nike

如何在 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

但我的情况更复杂,我必须在任何地方都进行此检查。考虑一下我可以通过三个可选子例程。

最佳答案

我的第一个想法是使用过程指针,但后来我注意到您指定了 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

使用多个可选子例程可能会变得有点复杂,但我认为并非不可能。

关于fortran - Fortran 90 中的可选子例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5042035/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com