サブルーチンがあるとします:
subroutine foo(x, Nx)
implicit none
integer, intent(IN) :: x
integer, intent(IN) :: Nx
select case(x)
case (1)
write(*,*) "Minimum value"
case (Nx)
write(*,*) "Maximum value"
case default
write(*,*) "Somewhere in-between"
end select
end subroutine foo
ドライバーが次のようになっているとします。
program main
implicit none
interface
subroutine foo(x,Nx)
integer, intent(IN) :: x
integer, intent(IN) :: Nx
end subroutine foo
end interface
integer, parameter :: Nx = 100
integer :: x
call foo(20, Nx)
end program main
上記のプログラムは、サブルーチンでcase (Nx)
無効なため、コンパイルされません。具体的には、ifort 16 で次のエラーが発生します。
エラー #6601: CASE ステートメントでは、case-value は定数式でなければなりません。
言い換えると、 Nx はを介して実質的にサブルーチン定数として宣言されintent(IN)
ますが、リテラル定数またはparameter
型のいずれかである必要がありますinteger
。
Nx
case ステートメントを、既知の定数パラメーターとして受け入れるようにする方法はありますか? Nx
渡されたことを宣言する方法はありparameter
ますか?
この単純で短い例では、if-then-elseif-else-end ブロックで十分であることはわかっていますが、そうすると、この質問に対する答えがわかりません。:-)