Fortran 数组在添加值时自动增长
Fortran array automatically growing when adding a value
是否有任何现有的方法可以在 Fortran 中模拟不断增长的数组?就像 C++ 中的矢量。当我在 Internet 上没有找到关于这个主题的任何内容时,我感到非常惊讶。
作为动机示例,假设我计算了一些递归关系并且我想存储我得到的所有中间数。我的停止标准是相邻结果之间的差异,所以我无法事先知道我应该为此分配多少内存。
我确定它以前曾在此站点的某处显示过,但我找不到它了。
首先,在Fortran 2003中,可以通过简单的方式添加一个元素
a = [a, item]
正如 francescalus 评论的那样。这可能会非常频繁地重新分配数组并且会很慢。
您可以让您的数组分配到比您的元素数量 n
稍大的尺寸。当您的元素数量 n
增长到超过数组 size(a)
的大小时,您可以分配一个更大的新数组(此处为 2x),然后将旧元素复制到那里。不幸的是,Fortran 中没有 realloc()
。
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
我省略了初始分配,这很简单。
这一切都可以用类型绑定过程放入派生类型中,并将其用作数据结构,但那是纯 Fortran 2003 而你想要 90。所以我展示 Fortran 95,因为 Fortran 90 有缺陷在许多方面用于可分配数组并且已经过时并且基本上已经死了。
是否有任何现有的方法可以在 Fortran 中模拟不断增长的数组?就像 C++ 中的矢量。当我在 Internet 上没有找到关于这个主题的任何内容时,我感到非常惊讶。
作为动机示例,假设我计算了一些递归关系并且我想存储我得到的所有中间数。我的停止标准是相邻结果之间的差异,所以我无法事先知道我应该为此分配多少内存。
我确定它以前曾在此站点的某处显示过,但我找不到它了。
首先,在Fortran 2003中,可以通过简单的方式添加一个元素
a = [a, item]
正如 francescalus 评论的那样。这可能会非常频繁地重新分配数组并且会很慢。
您可以让您的数组分配到比您的元素数量 n
稍大的尺寸。当您的元素数量 n
增长到超过数组 size(a)
的大小时,您可以分配一个更大的新数组(此处为 2x),然后将旧元素复制到那里。不幸的是,Fortran 中没有 realloc()
。
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
我省略了初始分配,这很简单。
这一切都可以用类型绑定过程放入派生类型中,并将其用作数据结构,但那是纯 Fortran 2003 而你想要 90。所以我展示 Fortran 95,因为 Fortran 90 有缺陷在许多方面用于可分配数组并且已经过时并且基本上已经死了。