roy*_*vib 3 arrays fortran allocation
在下面的代码中,我试图分配一个大小为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 :: ]
Run Code Online (Sandbox Code Playgroud)
此代码给出了预期的结果(例如,使用gfortran或ifort -assume realloc_lhs)
0
a(:) =
a(:) = 1
a(:) = 1 2
Run Code Online (Sandbox Code Playgroud)
这里有三个问题:
allocate( a( 0 ) )
?a(:)
自动初始化为零大小的数组吗?(实际上,即使我在第1行注释掉,代码似乎也能正常工作.)a = [a, 1]
吗?(我也尝试使用像a = []
或的空数组构造函数a = [integer::]
,但是它们没有编译,所以似乎是不允许的.)编辑
如果我a = []
在上面的代码中取消注释,gfortran5.3会给出错误消息:
Error: Empty array constructor at (1) is not allowed
Run Code Online (Sandbox Code Playgroud)
但如果我只取消注释该线a = [ integer :: ]
,它没有问题!因为我最初同时取消了这两行,我误解了这两种方式都是非法的,但实际上后者似乎没问题(请参阅@francescalus答案).
1是的.Fortran很酷,有0个大小的阵列.
2 a(:)
不是数组而是数组部分(尽管是包含整个数组的数组).未定义自动重新分配以在数组部分上工作,因此
allocate(a(0))
a(:) = [1 2 3]
Run Code Online (Sandbox Code Playgroud)
不起作用.在我的测试中,代码已编译并执行但仍a
保留0
大小.
至于代码是否a = [a,1]
应该工作,如果a
以前没有分配(0-或任何其他大小)我的标准读取是这不符合标准,你的编译器(我的)也是错误的.我希望这是我对标准的误读.也许其他人会来并正确解释.
3是的
allocate(a(0))
a = [a, 1]
Run Code Online (Sandbox Code Playgroud)
很好,它符合标准,并按照您的期望工作.正如您所注意到的,在自动分配中不允许使用空数组构造函数
归档时间: |
|
查看次数: |
3585 次 |
最近记录: |