【发布时间】:2016-02-27 15:58:20
【问题描述】:
在下面的代码中,我试图增加a(:)的长度,首先分配一个更大的临时数组buf(:),将a(:)的内容复制到buf(:),然后使用move_alloc()将数组描述符从buf 复制到a:
program main
implicit none
integer, allocatable :: a(:), buf(:)
allocate( a(2) )
a = [1,2]
allocate( buf( 4 ), source= 0 ) !! (1)
buf( 1:2 ) = a( 1:2 ) !! (2)
! allocate( buf( 4 ), source= a ) !! (3)
! deallocate( a ) !! (4)
call move_alloc( buf, a )
print *, "a(:) = ", a(:)
end
在这里,我有两个问题:首先,在第 4 行中,是否有必要在调用 move_alloc() 之前显式释放 a(:)...?即使没有第 4 行,gfortran 和 Intel Fortran 似乎都可以工作,但这是否意味着 move_alloc() 自动解除分配 a(:) 如果它是预先分配的?其次,我们能否将第 1 行和第 2 行替换为 3,即,对不同长度的数组使用源分配?我已经对此进行了试验,而且 gfortran 和 Intel Fortran 似乎都接受了它并获得了(显然)正确的结果。
【问题讨论】:
-
还有另一种方式
a=[a,0,0]到达终点。 -
[除了缺少
)和i的声明] 最终表达式没问题。源术语是一个通用表达式(有一些限制 - 松散地,不依赖于分配的东西),它会在初始时被评估一次。 -
我尝试了
allocate( buf(4), source=[a,0,0] )和allocate( buf(4), source=[a, (0, i=3,4)] ),都运行良好(没有运行时错误和正确的结果)。 [...] 的这种用法似乎非常灵活并且可能很有用... -
糟糕,交换了 cmets。到目前为止我还不知道数组构造函数的这种语法(用于包含整个数组),所以我想我今天学习了很多 :)
标签: arrays fortran allocation