gpt4 book ai didi

fortran - Fortran程序中的堆栈溢出

转载 作者:行者123 更新时间:2023-12-04 22:26:03 28 4
gpt4 key购买 nike

我的简单 Fortran 程序有问题。我在 Fortran 77 中工作,使用 Compaq Visual Fortran。程序结构必须是主程序和子程序的形式,因为它是与有限元方法相关的大程序的一部分。

我的问题是我想分别为 NHELENVELE 设置值 10000 和 10000,但是当我运行代码时,程序停止并给出以下错误:

forrt1: server <170>: program Exception - stack overflow

我已经尝试迭代减少所需的值,直到我达到 507 和 507。此时代码运行没有错误。

但是,将值增加到 508 和 508 会导致再次出现相同的错误。

我认为问题与子例程 NIGTEE 有关,因为当我在没有它的情况下重新排列程序时,一切正常。

我尝试使用菜单 project>>settings>>link>>output>>reserve & commit 将堆栈大小增加到最大值
但这并没有什么不同。

我怎么解决这个问题?

这是我的程序:
PARAMETER(NHELE=508,NVELE=508)
PARAMETER(NHNODE=NHELE+1,NVNODE=NVELE+1)
PARAMETER(NTOTALELE=NHELE*NVELE)

DIMENSION MELE(NTOTALELE,4)

CALL NIGTEE(NHELE,NVELE,NHNODE,NVNODE,NTOTALELE,MELE)

OPEN(UNIT=7,FILE='MeshNO For Rectangular.TXT',STATUS='UNKNOWN')
WRITE(7,500) ((MELE(I,J),J=1,4),I=1,NTOTALELE)
500 FORMAT(4I20)

STOP
END

SUBROUTINE NIGTEE(NHELE,NVELE,NHNODE,NVNODE,NTOTALELE,MELE)
DIMENSION NM(NVNODE,NHNODE),NODE(4)
DIMENSION MELE(NTOTALELE,4)

KK=0
DO 20 I=1,NVNODE
DO 20 J=1,NHNODE
KK=KK+1
NM(I,J)=KK
20 CONTINUE
KK=0
DO 30 I=1,NVELE
DO 30 J=1,NHELE
NODE(1)=NM(I,J)
NODE(2)=NM(I,J+1)
NODE(3)=NM(I+1,J+1)
NODE(4)=NM(I+1,J)
KK=KK+1
DO 50 II=1,4
50 MELE(KK,II)=NODE(II)

30 CONTINUE
RETURN
END

谢谢。

最佳答案

更新 :

这是你的实际问题。您的 NM 数组被 NHNODE 行声明为 NVNODE 单元格的二维数组。如果这是 10,000 x 10,000,那么除了程序使用的任何其他内存之外,单独分配这个数组将需要超过 381 兆字节的内存。 (相比之下,如果数组是 500 x 500,则同一数组只需要大约 1 兆字节的内存。)

问题是旧的 Fortran 会直接在代码段或堆栈上分配所有数组。操作系统“堆”(大对象的通用内存)的概念是在 1977 年发明的,但 Fortran 77 仍然没有任何构造来使用它。因此,每次调用您的子程序时,它都必须压入堆栈指针,以便为堆栈上的 381 兆字节空间腾出空间。这几乎肯定大于您的操作系统允许堆栈段的空间量,并且您正在溢出堆栈内存(因此得到 stack overflow )。

解决方案是从不同的地方分配该内存。我知道在旧的 Fortran 中,可以使用 COMMON 块直接从代码段静态分配内存。你仍然不能动态分配更多,所以你的子程序不能重入,但是如果你的子程序一次只被调用一次(看起来是这样),这可能是最好的解决方案。

更好的解决方案是切换到 Fortran 90 或更新版本,并使用 ALLOCATE 关键字在堆而不是堆栈上动态分配数组。然后你可以分配尽可能大的块,因为你的操作系统可以给你,但你不必担心堆栈溢出,因为内存将来自另一个地方。

您可以通过在编译器中更改它来解决此问题,如 M.S.B.建议,但更好的解决方案是简单地修复代码。

关于fortran - Fortran程序中的堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1649155/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com