Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/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,我已经用Compaq Visual Fortran编写了一个程序。程序正常,并且在许多情况下运行正常。我现在处理的案例更大,输入数据文件更大,当我运行程序时,我出现以下错误: forrtl:服务器170:程序异常-堆栈溢出 我安装了editbin.exe程序,但我真的不知道如何使用它。打字时 editbin /STACK:4000000 DFDEV.exe 它告诉我它无法打开DFDEV.exe,即使我在包含此程序的目录C:\program Files\Microsoft Visual Stud

我已经用Compaq Visual Fortran编写了一个程序。程序正常,并且在许多情况下运行正常。我现在处理的案例更大,输入数据文件更大,当我运行程序时,我出现以下错误:

forrtl:服务器170:程序异常-堆栈溢出

我安装了editbin.exe程序,但我真的不知道如何使用它。打字时

editbin /STACK:4000000 DFDEV.exe
它告诉我它无法打开DFDEV.exe,即使我在包含此程序的目录C:\program Files\Microsoft Visual Studio\Common\MSDEV98\BIN中。
我真的不知道如何解决这个问题,在我在互联网上找到的关于这个主题的每一个主题中,都没有关于如何使用这个editbin程序的解释。

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

有一个编译器选项可以假设子例程中声明的存储是自动的,但是,有些程序很可能依赖于调用之间静态存储的数据,而没有指定保存。我一直在小心保存,并没有注意到任何效果与自动选择。在我的例子中,问题是在我引入了Burroughs fortran中自动可用的一个小递归之后开始的-递归关键字是无效的,但堆栈存储也用于临时变量,可能是数组大小和复制入、复制出参数(如数组节),或者,例如,传递blob类型的数组,其中blob是一个复合实体,包含一个整数,您希望将整数表示为数组,如Ai:j.Fred中所示,其中在存储器中,Fred的连续元素实际上不与stride=1相邻,因为blob还包含其他项


无论如何,我开始使用分配的数组,以便使用不规则的数组,而不是abigenough、n等和其他更改,我刚刚检查并发现设置已恢复为默认的空白项,毫无疑问,这是因为在一台新电脑的电源出现故障后,重新安装了一台新电脑。

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

有一个编译器选项可以假设子例程中声明的存储是自动的,但是,有些程序很可能依赖于调用之间静态存储的数据,而没有指定保存。我一直在小心保存,并没有注意到任何效果与自动选择。在我的例子中,问题是在我引入了Burroughs fortran中自动可用的一个小递归之后开始的-递归关键字是无效的,但堆栈存储也用于临时变量,可能是数组大小和复制入、复制出参数(如数组节),或者,例如,传递blob类型的数组,其中blob是一个复合实体,包含一个整数,您希望将整数表示为数组,如Ai:j.Fred中所示,其中在存储器中,Fred的连续元素实际上不与stride=1相邻,因为blob还包含其他项


无论如何,我开始使用分配的数组,以便使用不规则的数组,而不是abigenough、n等和其他更改,我刚刚检查并发现设置已恢复为默认的空白项,毫无疑问,由于在电源故障后,在新计算机上介入重新安装。

如果您的问题是您的数据太大而不能适合堆栈,则可以考虑在堆上分配。+ 1到DavidHeffernan的评论;尤其是对于不使用动态分配的旧fortran程序,堆栈溢出几乎总是意味着子例程或函数中的大型静态数组变得太大,无法装入堆栈。根据您的操作系统,有一些变通方法,或者您可以说服编译器在堆上分配大数组,但最好的方法是开始努力避免使用如此大的静态数组,而是根据需要分配它们。如果数据非常大,您可以尝试使用类似于标志的共享在堆中分配它。我不知道是否正确的标志是-share,至少在英特尔编译器中,这个标志是-share intelIn Fortran,我相信这就是所谓的动态分配。但是我对Fortran一无所知,所以我不知道语法。Fortran语言标准没有sta的概念
ck和heap。有些编译器有编译时选项来控制数组是否放置在堆栈上。可分配的数组很可能是堆而不是堆栈。如果你的问题是你的数据太大以至于不能适应堆栈,你可以考虑在堆上分配。+ 1到DavidHeffernan的评论;尤其是对于不使用动态分配的旧fortran程序,堆栈溢出几乎总是意味着子例程或函数中的大型静态数组变得太大,无法装入堆栈。根据您的操作系统,有一些变通方法,或者您可以说服编译器在堆上分配大数组,但最好的方法是开始努力避免使用如此大的静态数组,而是根据需要分配它们。如果数据非常大,您可以尝试使用类似于标志的共享在堆中分配它。我不知道是否正确的标志是-share,至少在英特尔编译器中,这个标志是-share intelIn Fortran,我相信这就是所谓的动态分配。但是我对Fortran一无所知,所以我不知道语法。Fortran语言标准没有堆栈和堆的概念。有些编译器有编译时选项来控制数组是否放置在堆栈上。可分配数组很可能放在堆上而不是堆栈上。