Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重温:Fortran程序中的堆栈溢出_Fortran_Stack Overflow - Fatal编程技术网

重温:Fortran程序中的堆栈溢出

重温:Fortran程序中的堆栈溢出,fortran,stack-overflow,Fortran,Stack Overflow,在Compac Fortran中执行以下代码时,我遇到堆栈溢出。 特别针对该线路: DIMENSION IZ(NX,NY),VX(NX-1,NY-1),VY(NX-1,NY-1),VZ(NX-1,NY-1) 我要做的是从参数文件中读取NX,NY,DX,DY 有什么建议吗 PARAMETER(NGMAX=30000) INTEGER NX,NY,DX,DY OPEN(6,FILE='MGSTAOriggroup15.asc',STATUS='old')

在Compac Fortran中执行以下代码时,我遇到堆栈溢出。 特别针对该线路:

DIMENSION IZ(NX,NY),VX(NX-1,NY-1),VY(NX-1,NY-1),VZ(NX-1,NY-1)
我要做的是从参数文件中读取NX,NY,DX,DY

有什么建议吗

       PARAMETER(NGMAX=30000)
       INTEGER NX,NY,DX,DY
       OPEN(6,FILE='MGSTAOriggroup15.asc',STATUS='old')
       OPEN(7,FILE='Gravity.asc',STATUS='old')
       OPEN(8,FILE='Gravity200.nor',STATUS='old')
       OPEN(9,FILE='linana.para',STATUS='old')
       OPEN(10,FILE='MGSTAOriggroup15coord.dat',STATUS='unknown')
       OPEN(12,FILE='MGSTAOriggroup15ncoord.dat',STATUS='unknown')
       OPEN(11,FILE='linana.fsn',STATUS='unknown')
       READ(9,*) NX,NY,DX,DY
       CALL ANALYSIS(NX,NY)
       Close(6)
       Close(7)
       Close(8)
       Close(9)
       Close(10)
       Close(11)
       Close(12)
C
       STOP 
     END
C 
      SUBROUTINE ANALYSIS(NX,NY)
      INTEGER NX,NY,DX,DY
      COMMON/COM1/ DX,DY
      PARAMETER(NGMAX=30000)
      DIMENSION KO(NGMAX)
      DIMENSION XLS(NGMAX,100),XLE(NGMAX,100),
     &          YLS(NGMAX,100),YLE(NGMAX,100)
      DIMENSION IZ(NX,NY),VX(NX-1,NY-1),VY(NX-1,NY-1),VZ(NX-1,NY-1)
      """"""""""""""""""""""""""""""""""""""""""""
      To the end
注意:从
(NGMAX=30000)
更改为
(NGMAX=30)
没有帮助

是的,我已将NGMAX的所有实例更改为30

下面列出了新版本


我很抱歉: 我一整天都在编写代码,最后终于成功了。 然而,声明NX和NY是我们不需要的。 我想从参数文件中读取这些参数。 代码如下:




听起来像是子例程
分析
根据传入堆栈的参数(
NX
NY
)在堆栈上分配空间。如果这些值太大,那么堆栈上可能没有足够的空间来分配数组


您可以做的是打印从
linana.para
文件中读取的
NX
NY
的值,以查看它们对您的应用程序是否有意义。

假设异常发生在您提到的行上,那么您的程序堆栈对于分配在其上的变量来说不够大。您需要在编译器中找到该标志,以增加程序上的默认堆栈分配。或者,如果您根本不使用递归,那么可以将这些变量设置为全局变量,这样就不会在堆栈上分配它们

请注意您正在分配的大小:

PARAMETER(NGMAX=30000)
DIMENSION KO(NGMAX)
DIMENSION XLS(NGMAX,100),XLE(NGMAX,100),YLS(NGMAX,100),YLE(NGMAX,100)
DIMENSION IZ(NX,NY),VX(NX-1,NY-1),VY(NX-1,NY-1),VZ(NX-1,NY-1)
您正在为四个数组
XLS
XLE
YLS
YLE
中的每一个分配30000*100个值的空间(
real
s,我假定)。这是12000000个值。假设32位的值,它是48兆的内存。但我隐约记得,在某些平台上,real是80位的?在这种情况下,它将是120兆内存

你真的需要你的数组在一个维度上有30000个元素长吗?如果没有,减少分配可能会对你有所帮助

查看您正在使用的FORTRAN编译器的编译器选项。我记得VAX/VMS FORTRAN编译器有一个命令行选项,可以使所有变量都是静态的,也就是说不在堆栈上分配。假设您可以保证不会执行任何递归,这可能是解决问题的最快方法


另一种选择是将所有大型阵列放入公共块中,但请注意,公共块中的阵列不能动态调整大小。

Heh。从技术上讲,这可能属于ServerFault,因为这是一个操作系统问题,但我认为那里也没有人会回答VMS的问题。对于我和VMS来说已经有一段时间了,对于FORTRAN来说甚至更长,但我会尝试一下

好的,这里是您得到的:分析子例程有4个数组,每个数组有(30000*100)=3000000个单元格,每个单元格有12M个单元格,或者每个数组有8个字节(我想是吗?)用于72Mbytes。再加上整数数组IZ和实数数组VX、VY和VZ占用的空间,我无法估计它们,因为我不知道NX和NY的最大值是多少

无论如何,VAX上至少有144000页,Alpha上至少有24000页(加上其他4个阵列)。您的进程地址表需要至少是它的2倍(实际上稍微多一些),因为用户堆栈只得到它的一半

因此,转到命令提示符并键入“SHOW PROC/MEM”,然后告诉我它说了什么(我想我是对的)

注意:NX,NY只是维度的参数,它是占用堆栈的数组

使数组全局化可能不起作用,因为堆和静态分配空间并不比堆栈大


好的,我看到你的最大NX,NY值是5000。那是另外一个4*25000000或100000000。每个字节8个,即800MB加上上面的72MB。坏消息是,无论VMS进程设置如何,VAX在体系结构上都被限制为1GB的用户堆栈,所以让我们希望浮点数是4字节(而不是8字节),或者您是在Alpha上。

如果是这样,那么您的代码看起来是Fortran77。如果不是这样,下面的内容应该有一定意义,如果不是这样,它可能会给您一些线索

在Fortran77中,语言标准中不支持动态内存分配,许多编译器确实对它有一些支持,但使用编译器特定的扩展。您的代码不会触发任何这样的扩展内存

一种方法是生成一个主程序,该程序将声明数组空间,然后将数组作为参数传递给子例程。该主程序将被编译并与其余代码链接。每一组值将生成一个新的主程序

例如,对于NX=2456&NY=789

  PROGRAM MAIN
  INTEGER NX, NY
  DIMENSION IZ(2456,789),VX(2455,788),VY(2455,788),VZ(2455,788)
  NX=2456
  NY=789
  CALL ANALYSIS(NX,NY,IZ,VX,VY,VZ)
  STOP
  END

  SUBROUTINE ANALYSIS(NX,NY,IZ,VX,VY,VZ)
  INTEGER NX,NY,DX,DY
  DIMENSION IZ(NX,NY),VX(NX-1,NY-1),VY(NX-1,NY-1),VZ(NX-1,NY-1)
。。。 返回 结束


我记不清了,但可能在主程序中使用了parameter语句,因此您可以完全参数化上面的主程序。

这不是操作系统问题,而是编程问题!好吧,它可能只能由一个有特权的管理员来修复,那么你会怎么说呢?把巨大的数组从堆栈上移开怎么样?我想没有一种方法可以证明这不是一个编程问题。马克:我想现在看到我们的脱节了:我说过我认为这是一个管理员问题,但是,我没有说我认为这不是一个编程问题。毕竟,两者都可以。(我想这就是为什么我们在这里使用标签而不是文件夹;-))。问题在于,在某些分类上存在着一种“非此即彼”的心态,这种心态并不总是有意义的。我本不打算把我的间接观察作为将这个问题转移到ServerFault的论据。VM上的编译器没有这样的切换。这是由流程参数控制的,流程参数(通常)由用户授权文件设置设置,而用户授权文件设置反过来又是
PARAMETER(NGMAX=30000)
DIMENSION KO(NGMAX)
DIMENSION XLS(NGMAX,100),XLE(NGMAX,100),YLS(NGMAX,100),YLE(NGMAX,100)
DIMENSION IZ(NX,NY),VX(NX-1,NY-1),VY(NX-1,NY-1),VZ(NX-1,NY-1)
  PROGRAM MAIN
  INTEGER NX, NY
  DIMENSION IZ(2456,789),VX(2455,788),VY(2455,788),VZ(2455,788)
  NX=2456
  NY=789
  CALL ANALYSIS(NX,NY,IZ,VX,VY,VZ)
  STOP
  END

  SUBROUTINE ANALYSIS(NX,NY,IZ,VX,VY,VZ)
  INTEGER NX,NY,DX,DY
  DIMENSION IZ(NX,NY),VX(NX-1,NY-1),VY(NX-1,NY-1),VZ(NX-1,NY-1)