在Fortran-90中将参数作为参数传递?

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块就足够了,但后来我不知道这个问题的答案.:-)

Vla*_*r F 5

只需使用if语句.子程序参数(您调用参数)当然不是参数(命名常量).它intent(in)并没有使它成为一个有效的参数,它只是一个你不会改变它的承诺,但有办法绕过它.case语句需要一个编译时常量.