【问题标题】:Fortran77 program does not executeFortran77 程序不执行
【发布时间】:2018-09-24 21:04:33
【问题描述】:

工作中的 Fortran 编译器有时会生成无效的 Win32 .exe 文件

大家好,

一些工作的 Fortran 编译器在某些情况下似乎有奇怪的行为。我尝试编译和运行 John Denton 教授的程序,可以在这里找到:

https://www.dropbox.com/sh/8i0jyxzjb57q4j4/AABD9GQ1MUFwUm5hMWFylucva?dl=0

Meangen und Stagen 程序的不同版本可以编译并正常工作。最后一个名为 Multall 的程序也有几个不同的版本。和以前一样,可以毫无问题地编译适当的源代码。但是:当我尝试运行生成的 .exe 文件时,我收到一条非常奇怪的错误消息,说 Multall 的 .exe 不是有效的 Win32 可执行文件。

我在 Windows XP 和 Windows 8 上使用了四种不同的 Fortran 编译器(g77、Cygwin、Mingw、FTN95),结果总是相同。我进行了几次测试,在我看来,奇怪的错误消息的原因是 Multall 包含大量源代码。代码有16000多行,可能是编译器默认为代码段分配的内存太小导致溢出。

我尝试了 g77 编译器的几个命令行选项以增加代码段的内存量,但都没有奏效。谁能告诉我 g77 的哪些命令行选项可以让 Multall 的 .exe 大型程序正常工作?还是我错了,奇怪的错误信息与代码段无关?谁能帮帮我?

非常感谢,非常感谢您的帮助

【问题讨论】:

  • 160,000 并不是一个非常大的程序 - 有很多超过 1,000,000 行的示例,并且这些可以很好地编译。更进一步,您能否向我们展示您所做的确切操作,以及生成的确切错误消息和使用的编译器版本?更好的是看看您是否可以生成一个显示完全相同症状的小代码。这就是说,我在看了 5 分钟后猜测是公共块中的至少 3.8 GByte(应该在 25 年前被抛弃)是导致您的问题的原因。
  • 正如 Ian 所暗示的,您必须使用可分配数组(和 x64 模式)才能超过 3.8 GB 的限制。
  • 代码大小为 16,000。不是 160,000。但您的评论不受此影响。

标签: fortran


【解决方案1】:

确实,问题不在于程序大小,而在于堆栈大小。这是由于大的公共块。作为测试,您可以将 commall-open-18.3 中的 JD 降低到 1000,您会注意到问题已解决。 您可以检查数组是否过大并调整一些参数。

【讨论】:

  • 非常感谢,希望能解决问题!
  • 将 JD 降到 1000 确实至少可以解决 Linux 上的问题。我会说在没有公共块的情况下重写代码,也许在现代 fortran 中......
  • 感谢我将 commall-open-18.3 中的 JD 设置为 1000(之前的 2500),并且“不是有效的 Win32 程序”消失了,程序运行正常。
猜你喜欢
  • 1970-01-01
  • 2017-06-19
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多