首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Fortran递归分割错误

Fortran递归分割错误
EN

Stack Overflow用户
提问于 2010-04-15 02:56:33
回答 2查看 1.1K关注 0票数 3

我必须设计和实现一个Fortran例程来确定正方形网格上集群的大小,而且递归编码子例程似乎非常方便。但是,每当我的晶格大小增长到超过某个值(大约200个/边)时,子例程始终会出现分段。下面是我的集群检测例程:

代码语言:javascript
复制
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)表示西,依此类推。什么会导致不稳定的段错误行为?对于较大的网格尺寸,集群是不是“太大了”?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-04-15 09:16:35

我想你遇到了一个堆栈溢出。如果你的晶格每边超过200个单位,那就是40,000个单位,这意味着你正在递归40,000次。根据您的堆栈大小和堆栈框架大小,您可能很容易耗尽堆栈空间。

为了处理更大的网格,您必须将算法转换为使用较少堆栈空间的算法。Wikipedia提供了一些实现(用伪代码)来说明如何在不破坏堆栈的情况下进行泛洪填充。

票数 4
EN

Stack Overflow用户

发布于 2010-04-15 04:57:50

1)您是否尝试过编译,然后在打开下标范围检查的情况下运行?只是为了确保较大的大小不会暴露出一个bug,即代码跨过数组边界进入非法内存。这是一个简单的检查。

2)重新考虑程序内存不足的可能性:尝试增加每个进程的堆栈大小限制。如何做到这一点取决于操作系统--搜索此处,或者google,或者告诉我们您的操作系统。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2640190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档