添加值时Fortran阵列会自动增长

Dar*_*nin 2 fortran vector dynamic-allocation

有没有现成的方法来模拟Fortran中不断增长的数组?就像C++中的vector一样.当我在互联网上没有找到关于这个主题的任何内容时,我感到非常惊讶.

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

Vla*_*r F 6

我相信它之前已经显示在这个网站的某个地方,但我找不到它.

首先,在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在很多方面都有缺陷可分配数组并且绝望地过时并且基本上已经死了.

  • 于是用C++,问题解决了。他们最终引入了可用的动态分配的连续 3D 数组吗?有任何起始索引吗?创建这样的库并不像看起来那么简单,需要该语言的更多支持 https://groups.google.com/forum/#!topic/comp.lang.fortran/jIVnmL9b2ZY[26-50] (2认同)