我已经用Fortran 90.一直致力于精美的相当长一段时间写了一个相当大的程序,但今天我上前一步了一个档次,增加问题大小(它是一家集科研非标准FE-求解,如果帮助任何人...)现在我得到"堆栈溢出"错误消息,自然程序终止,而没有给我任何有用的工作.
该程序首先设置所有相关的数组和矩阵,然后完成后,它会将一些关于此的统计信息打印到日志文件中.即使我有一个新的,更大的问题,这个工作正常(尽管有点慢),但随着"数字运算"开始失败.
让我感到困惑的是,那一点上的所有东西都已经分配了(而且没有错误).我不完全确定堆栈是什么(维基百科和这里的几个步骤没有做太多,因为我对计算机的"幕后"工作只有非常基本的知识).
假设我有一些数组初始化为:
INTEGER,DIMENSION(64) :: IA
REAL(8),DIMENSION(:,:),ALLOCATABLE :: AA, BB
Run Code Online (Sandbox Code Playgroud)
在一些初始化例程(即从文件读取输入等)之后被分配为(我存储一些大小整数以便更容易地传递到固定大小的IA中的子例程):
ALLOCATE( AA(N1,N2) , BB(N1,N2) )
IA(1) = N1
IA(2) = N2
Run Code Online (Sandbox Code Playgroud)
这基本上是在初始部分发生的事情,到目前为止一直很好.但是当我接下来调用子程序时
CALL ROUTINE_ONE(AA,BB,IA)
Run Code Online (Sandbox Code Playgroud)
例程看起来像(没什么特别的):
SUBROUTINE ROUTINE_ONE(AA,BB,IA)
IMPLICIT NONE
INTEGER,DIMENSION(64) :: IA
REAL(8),DIMENSION(IA(1),IA(2)) :: AA, BB
...
do lots of other stuff
...
END SUBROUTINE ROUTINE_ONE
Run Code Online (Sandbox Code Playgroud)
现在我收到一个错误!屏幕输出显示:
forrtl: severe (170): Program Exception - stack overflow
Run Code Online (Sandbox Code Playgroud)
然而,当我与调试器中运行该程序它一个名为处断裂线419 winsig.c
(不是我的文件,但可能是编译器的一部分?).它似乎是一个sigreterror:
被调用的例程的一部分,它是已被调用的默认情况,返回文本Invalid signal or error
.这附有评论专栏,奇怪地说/* should never happen, but compiler can't tell */
......?
所以我想我的问题是,为什么会发生这种情况以及实际发生了什么?我认为只要我可以分配所有相关的内存我应该没问题?对子程序的调用是否会复制参数,或只是指向它们的指针?如果答案是副本,那么我可以看到问题可能在哪里,如果是这样的话:关于如何绕过它的任何想法?
我试图解决的问题很大,但不以任何方式疯狂.标准的FE解算器可以处理比我现在更大的问题.我在Dell …