如何在Fortran中即时增加数组大小?

Pur*_*ret 10 arrays fortran dynamic-arrays fortran90

我的程序正在运行,虽然3D阵列,标签"群",它发现,然后做一些检查,看看是否有临近簇具有比目前更高的集群的标签.还有第二个数组保存了"正确的"群集标签.如果它发现正确标记了第n个相邻簇,则将该元素分配给0,否则将其分配给正确的标签(例如,如果第n个站点具有标签2,并且邻居标记为3,则第3个元素为labelArray设置为2).老实说,我有充分的理由这样做!

我想要的只是能够分配动态的第n个元素labelArray.我已经看过可分配的数组并将事物声明为,labelArray(*)但我并不是真的理解这些,尽管在网上搜索和StackOverflow.

因此,任何帮助这样做都会很棒.

M. *_* B. 10

这是一个Stack Overflow问题,其中一些代码示例显示了使用Fortran可分配数组的几种方法:如何将先前未知数组作为Fortran中函数的输出:使用新的move_alloc声明,分配,测试已经分配的内容和分配.未显示存在显式释放,因为示例在退出过程时使用move_alloc和自动释放.

PS如果要重复添加一个元素,您应该考虑数据结构方法.通过增长数组一次添加一个元素不是一种有效的方法.在Fortran中将数组从N个元素增长到N + 1可能意味着创建一个新数组并复制所有现有元素.更合适的数据结构可能是链表.您可以通过创建用户定义的类型并使用指针在Fortran中创建链接列表.你将成员链接在一起,指向一个成员.添加其他成员的开销很小.缺点是最容易按顺序访问列表成员.使用索引,您无法轻松地以任何顺序访问成员.

有关Fortran链接列表的信息,我在网上找到:http://www-uxsup.csx.cam.ac.uk/courses/Fortran/paper_12.pdfhttp://www.iag.uni-stuttgart.de /IAG/institut/abteilungen/numerik/images/4/4c/Pointer_Introduction.pdf


Vla*_*r F 7

如果声明一个可分配的数组,则使用real形式的deffered shape,

allocatable :: labelArray(:,:)

, 要么

real,dimension(:,:),allocatable :: labelArray

双冒号的数量意味着数组的排名(索引的数量).

如果数组未分配,则使用

 allocate(labelarray(shapeyouwant))
Run Code Online (Sandbox Code Playgroud)

使用正确数量的索引.例如allocate(labelarray(2:3,-1:5)),对于在demension 1中具有索引2到3并且在维度2中具有-1到5的数组.

要更改尺寸,您必须首先使用释放数组

deallocate(labelArray)
Run Code Online (Sandbox Code Playgroud)

要将已分配的数组重新分配给新形状,首先需要使用新形状分配新数组,将现有数组复制到新数组,然后使用旧数组的引用移动到新数组move_alloc().

  call allocate(tmp(size_old+n_enlarge))
  tmp(1:size_old) = array(1:size_old)
  call move_alloc(tmp, array)
Run Code Online (Sandbox Code Playgroud)

移动新数组引用时,将自动释放旧数组move_alloc().


Fortran 95会自动释放数组,如果它们超出范围(例如,子程序结束).

Fortran 2008具有自动分配任务的一个很好的功能.如果您说array1=array2并且未分配array1,则会自动分配它以具有正确的形状.

  • 不,这是不可能的.您无法更改数组的已分配维度.这将是复杂的.该程序无论如何都必须制作副本.你必须1)创建一个新的更大的数组并复制到它,或2)制作你的数组的副本,`deallocate`它,`分配'它更大并复制保存的值.如果您的编译器支持它,您可以使用`move_alloc`而不是copy,那么您不必释放您的数组,只需将`allocate`放大,然后将保存的值复制回来. (3认同)
  • 这必须是评论两部分之间最长时间的记录. (2认同)