4

我怎样才能在 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

但我的情况更复杂,我不得不把这张支票放在任何地方。考虑到我可以通过三个可选子例程。

4

1 回答 1

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  

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

于 2011-02-18T16:22:34.040 回答