保留固有分配中分配的界限

时间:2019-05-13 14:52:16

标签: arrays fortran

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

import { Link } from 'react-router-dom';
import Link1 from 'my-components-repo/path/Link';
...
<Link to="/">Works</Link>
<Link1 to="/">Doesn't work</Link1>

gfortran和ifort都给出输出:

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

为什么c的边界与a和b的边界相同?是否有一种简短且简洁的方法(无需显式分配)来确保c具有相同的边界?

2 个答案:

答案 0 :(得分:3)

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

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)

答案 1 :(得分:2)

为什么c没有和und b一样的边界?

因为它将被分配为与ab相同的形状,并且从1开始。(无论如何b-a是一个表达式,它也从1开始,但是它是不重要,如果ba从不同的索引处开始怎么办?)

是否存在一种简短且简洁的方法(无需显式分配)来确保c具有相同的边界?

不。但是您至少可以显式分配mold=asource=a

相关问题