Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran select case语句中的非常量变量_Fortran - Fatal编程技术网

Fortran select case语句中的非常量变量

Fortran select case语句中的非常量变量,fortran,Fortran,假设我的Fortran程序中有以下代码: recursive function T_GreCoDi( n, m ) result (GCD) implicit none integer, intent(in) :: n, m integer :: GCD select case(n) case(0) select case(m) case(0) print *, 'both of your numbers are zero

假设我的Fortran程序中有以下代码:

recursive function T_GreCoDi( n, m ) result (GCD)
  implicit none
  integer, intent(in) :: n, m
  integer :: GCD

  select case(n)
    case(0)
      select case(m)
        case(0)
          print *, 'both of your numbers are zeros. GCD = -1'
          GCD = -1
        case default
          GCD = m
      end select
    case(1)
      GCD = 1
    case default
      select case(m)
        case(0)
          GCD = n
        case(:n)!<--THIS IS PROBLEM
          GCD = T_GreCoDi(n-m, m)
        case default
          GCD = T_GreCoDi(m-n, n)
      end select
    end select
  end function T_GreCoDi
递归函数T_GreCoDi(n,m)结果(GCD) 隐式无 整数,意图(in)::n,m 整数::GCD 选择案例(n) 案例(0) 选择案例(m) 案例(0) 打印*,'两个数字都是零。GCD=-1' GCD=-1 案例违约 GCD=m 结束选择 案例(1) GCD=1 案例违约 选择案例(m) 案例(0) GCD=n
案例(:n) 如果我写这篇文章,我真的不会使用
selectcase
构造。不过,我会在这样的假设下回答,即就目前而言,这是必要的

一般的答案是使用案例选择器,无论哪种形式

  • (n)
  • (l:)
  • (l:u)
  • (:u)
它需要,那里的每一个事物(
n
l
u
)都必须是一个标量常量表达式。Fortran就是这么说的。这就是编译器抱怨的原因

要保留
选择case
构造,必须重写某些内容。但是什么呢

让我们看看这里的具体案例,以及部分

select case(n)
  case(0) ...
  case(1) ...
  case default     ! n is an integer not 0 or 1
    select case(m)
      case(0) ...
      case(****)   ! Something here for m<n and m.ne.0
        GCD = T_GreCoDi(n-m, m)
      case default
        GCD = T_GreCoDi(m-n, n)
    end select
  end select
你不想那样做。是

      GCD = T_GreCoDi(ABS(n-m), MIN(m,n))
更好

select case(n)
  case(0)
    select case(m)
      case(0)
        print *, 'both of your numbers are zeros. GCD = -1'
        GCD = -1
      case default
        GCD = m
    end select
  case(1)
    GCD = 1
  case default
    select case(m)
      case(0)
        GCD = n
      case default
        GCD = T_GreCoDi(ABS(n-m), MIN(m,n))
    end select
  end select

老实说,我认为这证实了我的怀疑,
案例结构
不是解决问题的方法。

我已经编辑了我的问题。真遗憾。我没有想到ABS的功能。谢谢你的主意。
select case(n)
  case(0)
    select case(m)
      case(0)
        print *, 'both of your numbers are zeros. GCD = -1'
        GCD = -1
      case default
        GCD = m
    end select
  case(1)
    GCD = 1
  case default
    select case(m)
      case(0)
        GCD = n
      case default
        GCD = T_GreCoDi(ABS(n-m), MIN(m,n))
    end select
  end select