gpt4 book ai didi

vector - Fortran 数组在添加值时自动增长

转载 作者:行者123 更新时间:2023-12-02 08:19:18 25 4
gpt4 key购买 nike

有没有现有的方法来模拟 Fortran 中不断增长的数组?就像 C++ 中的向量。当我在 Internet 上没有找到有关此主题的任何内容时,我感到非常惊讶。

作为一个动机示例,假设我计算了一些递归关系,并且我想存储我得到的所有中间数。我的停止标准是相邻结果之间的差异,所以我事先无法知道我应该为此分配多少内存。

最佳答案

我确信它以前曾在此站点的某个地方显示过,但我找不到它。

首先,在 Fortran 2003 中,您可以通过简单的方式添加一个元素

a = [a, item]

正如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

我省略了初始分配,它很简单。

这一切都可以放入带有类型绑定(bind)过程的派生类型中,并将其用作数据结构,但那是纯 Fortran 2003 并且您想要 90。所以我展示了 Fortran 95,因为 Fortran 90 在很多方面都存在可分配的缺陷数组并且已经过时并且基本上已经死了。

关于vector - Fortran 数组在添加值时自动增长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38758216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com