【发布时间】:2015-03-18 20:49:59
【问题描述】:
当我最初无法预测数组的确切大小时,我需要在 Fortran 90 中使用动态数组。所以我写了一个代码,每次新元素添加到数组末尾时,它都应该扩展可分配数组:
subroutine DArray()
double precision, dimension(:), allocatable :: list
allocate(list(1))
list(1) = 1.1
call AddToList(list, 2.2)
call AddToList(list, 3.2)
call AddToList(list, 4.2)
call AddToList(list, 5.2)
print *, list(1)
print *, list(2)
print *, list(3)
print *, list(4)
print *, list(5)
end
subroutine AddToList(list, element)
double precision :: element
double precision, dimension(:), allocatable :: list
double precision, dimension(:), allocatable :: clist
if(allocated(list)) then
isize = size(list)
allocate(clist(isize+1))
do i=1,isize
clist(i) = list(i)
end do
clist(i+1) = element
deallocate(list)
allocate(list(isize+1))
do i=1,isize+1
list(i) = clist(i)
end do
deallocate(clist)
end if
end
那么有人看看我是否在这里遗漏了什么吗?
由francescalus解决。
双精度动态数组的工作代码是:
module DynamicalArrays
contains
subroutine AddToList(list, element)
IMPLICIT NONE
integer :: i, isize
double precision, intent(in) :: element
double precision, dimension(:), allocatable, intent(inout) :: list
double precision, dimension(:), allocatable :: clist
if(allocated(list)) then
isize = size(list)
allocate(clist(isize+1))
do i=1,isize
clist(i) = list(i)
end do
clist(isize+1) = element
deallocate(list)
call move_alloc(clist, list)
else
allocate(list(1))
list(1) = element
end if
end subroutine AddToList
end module DynamicalArrays
可以从中填充数组的演示子程序是:
subroutine UserDArrayTest()
use DynamicalArrays
integer :: i
double precision, dimension(:), allocatable :: list
double precision :: temp
temp = 0.1
do i=1,10
temp = temp+1
call AddToList(list, temp)
end do
do i=1,10
print *, i, list(i)
end do
end
请注意,最好将模块代码保存在单独的文件中,但我也发现当模块代码高于主程序和子程序代码时它可以工作。
【问题讨论】:
-
你有什么问题/错误?
-
程序在
deallocate(list)冻结,没有任何进一步运行。没有打印出错误,它只是冻结并且什么都不做。 -
您可能不是指 Fortran 90,但在
DArray中,explicit interface 必须可用于AddToList:它具有可分配的虚拟参数。 -
我用已实现的接口更新了问题。但它们对我来说仍然无法正常工作......
-
请不要过多更改问题,也不要使用任何 [已解决] 标签。该问题是供未来读者参考的,并且可以通过其他方式看到它具有可接受的答案。这不是一个讨论论坛。
标签: fortran fortran90 dynamic-arrays intel-fortran