gpt4 book ai didi

arrays - 在内部赋值中保留分配边界

转载 作者:行者123 更新时间:2023-12-01 11:13:44 25 4
gpt4 key购买 nike

我在分配时使用自动分配来计算两个数组的差异,边界从 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 具有相同的边界?

最佳答案

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

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

但这相当不清楚,并且(重复 Vladimir F 回答中的一点)您是否希望下限为 ba如果这些不同。

为了完整性:
allocate(c(7:17), source=b-a)

关于arrays - 在内部赋值中保留分配边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56114861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com