我必须设计并实现一个Fortran例程来确定方格上的簇的大小,并且递归地编写子例程似乎非常方便。但是,每当我的晶格尺寸增长超过一定值(大约200 /侧)时,子程序就会始终出现段错误。这是我的集群检测例程:
RECURSIVE SUBROUTINE growCluster(lattice, adj, idx, area)
INTEGER, INTENT(INOUT) :: lattice(:), area
INTEGER, INTENT(IN) :: adj(:,:), idx
lattice(idx) = -1
area = area + 1
IF (lattice(adj(1,idx)).GT.0) &
CALL growCluster(lattice,adj,adj(1,idx),area)
IF (lattice(adj(2,idx)).GT.0) &
CALL growCluster(lattice,adj,adj(2,idx),area)
IF (lattice(adj(3,idx)).GT.0) &
CALL growCluster(lattice,adj,adj(3,idx),area)
IF (lattice(adj(4,idx)).GT.0) &
CALL growCluster(lattice,adj,adj(4,idx),area)
END SUBROUTINE growCluster
其中adj(1,n)表示站点n的北邻居,adj(2,n)表示西方,依此类推。什么会导致不稳定的段错误行为?对于大的晶格尺寸,集群是否“太大了”?
答案 0 :(得分:4)
我认为你正在遇到堆栈溢出。如果你的格子每边超过200个单位,那就是40,000单位,这意味着你要复制40,000次。根据您的堆栈大小和堆栈框架大小,您可能很容易耗尽堆栈空间。
您必须将算法转换为使用较少堆栈空间的算法才能处理更大的格子。 Wikipedia提供了一些实现(伪代码)实现泛洪填充而不会破坏堆栈的实现。
答案 1 :(得分:1)
1)您是否尝试过编译然后运行下标范围检查?只是为了确保大尺寸不会泄露代码跨越数组的错误,并将其绑定到非法内存中。这是一个简单的检查。
2)重新计算程序内存不足的可能性:尝试增加每进程堆栈大小限制。如何执行此操作取决于操作系统 - 在此搜索,或谷歌,或告诉我们您的操作系统。