在以下代碼中的可分配數組,我試圖通過首先分配較大尺寸的臨時數組buf(:)
,複製的a(:)
內容以buf(:)
,然後使用move_alloc()
到增加的a(:)
長度從buf
數組描述符複製到a
:擴展與MOVE_ALLOC和源分配
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和英特爾Fortran似乎也能正常工作,但是這是否意味着move_alloc()
會自動解除分配a(:)
的預分配?其次,我們可以用3替換第1行和第2行,即使用不同長度數組的源代碼分配?我已經做了實驗,再一次,gfortran和英特爾Fortran似乎都以(顯然)正確的結果接受它。
還有'a = [a,0,0]'來達到終點的另一種方式。 – francescalus
[除了缺少''''和'i'的聲明]最終表達式沒有問題。源項是一個通用表達式(有一些限制 - 鬆散地,不依賴於被分配的東西),一次和最初評估。 – francescalus
我嘗試過'allocate(buf(4),source = [a,0,0])'和'allocate(buf(4),source = [a,(0,i = 3,4)])''並且都工作正常(沒有運行時錯誤和正確的結果)。這種用法似乎非常靈活並且可能有用... – roygvib