加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

分配零大小的数组并在数组构造函数中使用

发布时间:2020-12-16 10:12:28 所属栏目:百科 来源:网络整理
导读:在下面的代码中,我试图分配一个大小为0的空数组,然后使用自动重新分配添加更多元素: integer,allocatable :: a(:)allocate( a(0) ) ! Line 1print *,size( a )print *,"a(:) = ",aa = [ a,1 ]print *,2 ]print *,a!! Error! a = []! a = [ integer :: ] 此
在下面的代码中,我试图分配一个大小为0的空数组,然后使用自动重新分配添加更多元素:

integer,allocatable :: a(:)

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

a = [ a,1 ]
print *,2 ]
print *,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 ::],但它们没有编译,所以似乎是不允许的.)

编辑

如果我在上面的代码中取消注释= [],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]

不起作用.在我的测试中,代码编译并执行但是剩下的是0大小.

至于代码a = [a,1]是否应该在以前没有被分配(0-或任何其他大小)的情况下工作,我对标准的阅读是这不是标准的符合和你的编译器(我也是)是错误的.我希望这是我对标准的误读.也许其他人会来并正确解释.

3是的

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读