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 つあるとします。