jvr*_*sem 3 parameters fortran fortran90 select-case intel-fortran
假设我有一个子程序:
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
Run Code Online (Sandbox Code Playgroud)
假设我的驱动程序看起来像这样:
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
Run Code Online (Sandbox Code Playgroud)
以上程序不会编译,因为在子程序中,case (Nx)无效.具体来说,ifort 16给出以下错误:
错误#6601:在CASE语句中,case-value必须是常量表达式.
换句话说,即使Nx被有效地声明为子程序常量via intent(IN),它也需要是文字常量或parameter类型integer.
有没有办法让case语句接受Nx为我们所知道的常量参数?有没有办法宣布Nx成为传入parameter?
我意识到在这个简单的简短例子中,if-then-elseif-else-end块就足够了,但后来我不知道这个问题的答案.:-)
只需使用if语句.子程序参数(您调用参数)当然不是参数(命名常量).它intent(in)并没有使它成为一个有效的参数,它只是一个你不会改变它的承诺,但有办法绕过它.case语句需要一个编译时常量.