2012-04-01 61 views
2

我用Compaq Visual Fortran编写了一个程序。该程序是好的,并在许多情况下正常运行。现在我工作的情况下较大,具有较大的输入数据文件,当我运行该程序,我有以下错误:使用Fortran进行堆栈溢出

forrtl: severe(170): Program exception - stack overflow

我已经安装了editbin.exe程序,但我真的不知道该怎么用它。当输入

editbin /STACK:4000000 DFDEV.exe 

它告诉我,它无法打开DFDEV.exe,即使我包含此程序的目录中(C:\ Program Files文件\微软的Visual Studio \ COMMON \ MSDEV98 \ BIN)。 我真的不知道如何解决这个问题,并且我在互联网上发现的关于这个主题的每个主题都没有解释如何使用这个editbin程序。

+0

也许你在运行'editbin'时必须提供'DFDEV.exe'的完整路径。如果您只是在命令行键入'editbin'而没有任何其他命令行输入,[您将得到一个总结editbin选项的用法语句](http://msdn.microsoft.com/zh-cn/library/xd3shwhf %28V = VS.80%29.aspx)。但是,如果您不知道如何使用editbin,是什么让您认为它是调试程序异常错误的正确工具? – Chris 2012-04-01 16:11:42

+2

如果您的问题是您的数据太大而无法放入堆栈,您可以考虑在堆上分配数据。 – 2012-04-01 16:27:31

+1

+1 @ DavidHeffernan的评论;特别是对于不使用动态分配的Fortran程序,堆栈溢出几乎总是意味着子程序或函数中的大型静态数组变得太大而不适合堆栈。根据你的操作系统,有变通的方法,或者你可以说服你的编译器在堆上分配大型数组,但最重要的是开始努力没有这么大的静态数组,而是根据需要分配它们。 – 2012-04-01 17:04:17

回答

0

我也发现编译器“帮助”无益。程序员指南提供了一些关于堆栈和堆分配的话,可以通过搜索“提交”找到,并提示EDITBIN.EXE可用于修改已编译的.exe文件。如后面提到的,还有编译器选项Project> Settings> Link> Output导致可以指定更大的值,但对什么值没有指导。

有一个编译器选项假定AUTOMATIC用于在子程序中声明的存储,但是,有些程序可能很容易依赖于调用之间存储“静态”的数据,而没有认真指定SAVE。我一直小心SAVE,并没有发现任何“自动”选择的影响。在我引入一个小递归(在Burroughs fortran中自动可用 - RECURSIVE关键字不可用)后,麻烦开始了,但是堆栈存储也用于临时变量(可能是数组大小)和拷入,拷出参数等。作为数组部分,或者,例如,传递一个blob类型的数组,其中blob是一个复合实体,其中包含一个整数,并且您希望将整数表示为一个数组,如A(i:j).Fred,存储位置,Fred的连续元素实际上并不相邻(因为stride = 1),因为blob也包含其他项目。

无论如何,我开始使用分配的数组(以便具有不规则的数组而不是(bigenough,n)等)和其他更改,我刚刚检查并发现设置已恢复为默认值(空白条目),无疑是由于在电源故障后在新计算机上干预重新安装。