一千萬個為什麽

搜索

Fortran遞歸分段錯誤

我必須設計並實現一個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)代表西方,依此類推。什麽會導致不穩定的段錯誤行為?對於大的晶格尺寸,集群是否“太大”?

最佳答案

我認為你正在遇到堆棧溢出。如果你的格子每邊超過200個單位,那就是40,000個單位,這意味著你要復制40,000次。根據您的堆棧大小和堆棧框架大小,您可能很容易耗盡堆棧空間。

您必須將算法轉換為使用較少堆棧空間以處理較大格子的算法。 維基百科提供了一些關於如何在不吹的情況下進行洪水填充的實現(偽代碼)你的堆棧。

轉載註明原文: Fortran遞歸分段錯誤