【问题标题】:Preserve bounds in allocation in intrinsic assignment保留内在分配中的分配界限
【发布时间】:2019-05-14 16:24:52
【问题描述】:

我在分配时使用自动分配来计算两个数组的差异,边界从 0 开始:

program main
   implicit none
   integer, allocatable :: a(:), b(:), c(:)

   allocate(a(0:10))
   allocate(b(0:10))

   a = 1
   b = 2

   write (*,*) lbound(a)
   write (*,*) lbound(b)

   c = b - a

   write (*,*) lbound(c)
end program main

gfortran 和 ifort 都给出输出:

       0
       0
       1

为什么 c 的边界与 a 和 b 不同?有没有一种简洁(没有明确分配)的方法来确保 c 具有相同的界限?

【问题讨论】:

    标签: arrays fortran


    【解决方案1】:

    考虑一个内部赋值语句,其中左侧未分配并且是一个数组:

    variable = expr
    

    在这种情况下,数组variable 被分配给表达式expr 的形状,其下限等于LBOUND(expr) 的值(参见Fortran 2018 10.2.1.3)。

    以问题为例

    c = b - a
    

    右侧是表达式b-a。对于此表达式,LBOUND(b-a) 等于 1:b-a 不是整个数组 (F2018 16.9.109)。因此分配时c 的下限为 1。

    在内部赋值中分配给变量的唯一方法是下限不是 1 是右侧的下限不是 1。在赋值中(c 未分配)

    c = b
    

    那么c 具有b 的下限。

    您可以避免使用显式分配语句

    c = b
    c = c - a
    

    但这还不是很清楚,并且(重复弗拉基米尔 F 的回答中的一点)如果它们不同,您是否希望下限为 ba 的下限。

    为了完整性:

    allocate(c(7:17), source=b-a)
    

    【讨论】:

      【解决方案2】:

      为什么 c 和 a 和 b 的边界不同?

      因为它应该被分配到与ab相同的形状并从1开始。(无论如何b-a是一个表达式,它也是从1开始的,但这并不重要。如果@ 987654324@和a从不同的索引开始?)

      有没有一种简洁(没有明确分配)的方法来确保 c 具有相同的边界?

      没有。但是您至少可以使用mold=asource=a 显式分配。

      【讨论】:

      • c = a也有这个问题,所以不光是操作人员的问题,我会使用模具解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-07
      • 1970-01-01
      相关资源
      最近更新 更多