Dar*_*nin 2 fortran vector dynamic-allocation
有没有现成的方法来模拟Fortran中不断增长的数组?就像C++中的vector一样.当我在互联网上没有找到关于这个主题的任何内容时,我感到非常惊讶.
作为一个动机示例,假设我计算一些递归关系,我想存储我得到的所有中间数.我的停止标准是相邻结果之间的差异,所以我事先不知道应该为此分配多少内存.
我相信它之前已经显示在这个网站的某个地方,但我找不到它.
首先,在Fortran 2003中,您可以通过简单添加一个元素
a = [a, item]
Run Code Online (Sandbox Code Playgroud)
正如francescalus评论的那样.这可能会经常重新分配阵列并且速度很慢.
您可以将阵列分配给比元素数量更大的数据n.当元素数量n增长到数组大小以上时,size(a)你可以分配一个更大的新数组(这里是2x)并在那里复制旧元素.realloc()不幸的是,在Fortran 没有.
module growing_array
implicit none
real, allocatable :: a(:)
integer :: n
contains
subroutine add_item(item)
real, allocatable :: tmp(:)
real, intent(in) :: item
if (n == size(a)) then
!this statement is F2003, it can be avoided, but I don't see why in 2016
call move_alloc(a, tmp)
allocate(a(n*2))
a(1:n) = tmp
end if
n = n + 1
a(n) = item
end subroutine
end module
Run Code Online (Sandbox Code Playgroud)
我省略了初始分配,这很简单.
这一切都可以放入带有类型绑定过程的派生类型,并将其用作数据结构,但这是纯粹的Fortran 2003,你想要90.所以我展示了Fortran 95,因为Fortran 90在很多方面都有缺陷可分配数组并且绝望地过时并且基本上已经死了.
| 归档时间: |
|
| 查看次数: |
687 次 |
| 最近记录: |