Fortran 90中的可选子例程

时间:2011-02-18 13:47:12

标签: fortran fortran90

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

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

1 个答案:

答案 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  

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