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

しかし、私のケースはより複雑で、このチェックをどこにでも配置する必要があります。渡すことができるオプションのサブルーチンが 3 つあるとします。

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 に答える