假设我有一个子程序:
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
。
有什么方法可以让 case 语句接受Nx
我们知道的常量参数吗?有什么方法可以声明Nx
为 pass-inparameter
吗?
我意识到在这个简单、简短的例子中,一个 if-then-elseif-else-end 块就足够了,但是我不知道这个问题的答案。:-)