gpt4 book ai didi

arrays - 零大小数组的分配和在数组构造函数中的使用

转载 作者:行者123 更新时间:2023-12-04 22:19:43 24 4
gpt4 key购买 nike

在下面的代码中,我尝试分配一个大小为 0 的空数组,然后使用自动重新分配添加更多元素:

integer, allocatable :: a(:)

allocate( a(0) ) ! Line 1
print *, size( a )
print *, "a(:) = ", a

a = [ a, 1 ]
print *, "a(:) = ", a

a = [ a, 2 ]
print *, "a(:) = ", a

!! Error
! a = []
! a = [ integer :: ]

此代码给出了预期的结果(例如,使用 gfortran 或 ifort -assume realloc_lhs)
           0
a(:) =
a(:) = 1
a(:) = 1 2

这里我有三个问题:
  • 首先,是否可以分配零大小的数组,例如 allocate( a( 0 ) )
  • 如果我们省略这样的显式分配,a(:) 会自动初始化为零大小的数组吗? (实际上,即使我注释掉第 1 行,代码似乎也能工作。)
  • 在像 a = [a, 1] 这样的数组构造函数中包含零大小的数组没有问题吗? (我也尝试使用空数组构造函数,如 a = []a = [integer::] ,但它们没有编译,所以似乎是不允许的。)

  • 编辑

    如果我在上面的代码中取消注释 a = [],gfortran5.3 会给出错误信息:
    Error: Empty array constructor at (1) is not allowed

    但是如果我只取消注释 a = [ integer :: ] 行,它就没有问题!因为我最初同时取消了这两行的注释,我误解了这两种方式都是非法的,但实际上后者似乎还可以(请参阅@francescalus 的回答)。

    最佳答案

    1 是的。 Fortran 对于 0 大小的数组很酷。

    2 a(:) 不是一个数组,而是一个数组部分(尽管它包含整个数组)。自动重新分配未定义为适用于数组部分,因此

    allocate(a(0))
    a(:) = [1 2 3]

    不起作用。在我的测试中,编译并执行了代码,但 a 留下了 0 大小。

    至于如果 a = [a,1] 之前没有被分配(分配到 0 或任何其他大小)代码 a 是否应该工作,我对标准的阅读是这不符合标准,并且您的编译器(我的也是)出错了。我希望这是我对标准的误读。也许其他人会出现并正确解释。

    3 是
    allocate(a(0))
    a = [a, 1]

    很好,它符合标准并且按您的预期工作。正如您所注意到的,自动分配中不允许使用空数组构造函数

    关于arrays - 零大小数组的分配和在数组构造函数中的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35250558/

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