分配零大小的数组并在数组构造函数中使用
在下面的代码中,我试图分配一个大小为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))吗? 编辑 如果我在上面的代码中取消注释= [],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] 很好,它符合标准,并按照您的期望工作.正如您所注意到的,在自动分配中不允许使用空数组构造函数 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |