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.pdf和http://www.iag.uni-stuttgart.de /IAG/institut/abteilungen/numerik/images/4/4c/Pointer_Introduction.pdf
如果声明一个可分配的数组,则使用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,则会自动分配它以具有正确的形状.
| 归档时间: |
|
| 查看次数: |
21713 次 |
| 最近记录: |