以下代码返回分段错误,因为我尝试传递的可分配数组未被正确识别(大小返回1,应该是3).在这个页面(http://www.eng-tips.com/viewthread.cfm?qid=170599)中,一个类似的例子似乎表明它应该在F95中正常工作; 我的代码文件有.F90扩展名,但我尝试将其更改为F95,我正在使用gfortran进行编译.
我的猜测是问题应该是我将可分配数组传递给子程序的方式; 我究竟做错了什么?
!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%!
PROGRAM test
!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%!
IMPLICIT NONE
DOUBLE PRECISION,ALLOCATABLE :: Array(:,:)
INTEGER :: iii,jjj
ALLOCATE(Array(3,3))
DO iii=1,3
DO jjj=1,3
Array(iii,jjj)=iii+jjj
PRINT*,Array(iii,jjj)
ENDDO
ENDDO
CALL Subtest(Array)
END PROGRAM
!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%!
SUBROUTINE Subtest(Array)
DOUBLE PRECISION,ALLOCATABLE,INTENT(IN) :: Array(:,:)
INTEGER :: iii,jjj
PRINT*,SIZE(Array,1),SIZE(Array,2)
DO iii=1,SIZE(Array,1)
DO jjj=1,SIZE(Array,2)
PRINT*,Array(iii,jjj)
ENDDO
ENDDO
END SUBROUTINE
!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%!
Run Code Online (Sandbox Code Playgroud) 我的程序正在运行,虽然3D阵列,标签"群",它发现,然后做一些检查,看看是否有临近簇具有比目前更高的集群的标签.还有第二个数组保存了"正确的"群集标签.如果它发现正确标记了第n个相邻簇,则将该元素分配给0,否则将其分配给正确的标签(例如,如果第n个站点具有标签2,并且邻居标记为3,则第3个元素为labelArray设置为2).老实说,我有充分的理由这样做!
我想要的只是能够分配动态的第n个元素labelArray.我已经看过可分配的数组并将事物声明为,labelArray(*)但我并不是真的理解这些,尽管在网上搜索和StackOverflow.
因此,任何帮助这样做都会很棒.
有没有现成的方法来模拟Fortran中不断增长的数组?就像C++中的vector一样.当我在互联网上没有找到关于这个主题的任何内容时,我感到非常惊讶.
作为一个动机示例,假设我计算一些递归关系,我想存储我得到的所有中间数.我的停止标准是相邻结果之间的差异,所以我事先不知道应该为此分配多少内存.