2

我正在使用一个旧的 FORTRAN 77 程序,我遇到了一个奇怪的错误。照原样,代码似乎运行良好,并且在不到一秒的时间内完成。但它会产生一堆我不感兴趣的无关输出。所以,我进入了源代码,并注释掉了所有额外的 WRITE 语句。

好吧,当我注释掉一些 WRITE 语句时,代码似乎运行得有点慢(尽管我对此不确定;它可能看起来更慢,因为我滚动的文本行数较少以让我忙碌) . 当我注释掉最后一个额外的 WRITE 语句时,程序就会挂起,并且永远不会完成执行。

现在,从逻辑上讲,注释掉 WRITE 语句应该仍然让程序的其余部分完全正常运行,对吗?我认为这意味着代码中潜伏着一些其他问题,并且 WRITE 语句以某种方式掩盖了它(可能是清除缓冲区?)。

一位了解 Fortran 的同事(为数不多的一位)建议我可能无意中注释掉了一个语句标签,但事实并非如此。另一位不了解 Fortran 但总体上对编程非常熟练的同事建议这对他来说听起来像是一个指针问题,但据我所知,我从来没有将越界索引传递给数组,我不确定还会出现这样的问题。

我正在 PowerPC Mac 计算机上使用 g77 编译程序。

4

2 回答 2

4

这听起来很不敏感,甚至可能很粗鲁,但是......

标准答案 1 适用于此 - 如果您理解问题,您将不会寻求帮助。如果你想获得体面的帮助,你需要展示实际问题,而不是你对你认为问题所在的解释。我们不能通过查看不是要调试的代码的东西来调试代码,或者甚至是问题的根源。

所以,显示代码!
- 声明很重要
- 你如何编译它,打开了哪些选项?
- 跨出数组边界是编译器在编译时应该捕获的东西
- 是写到屏幕或其他单元(文件)的写语句;以后有没有可能从中读取一些东西?
- 这可能是保存和初始化值的问题吗?(这里只是猜测)

你说程序“挂起”。您是否尝试过确定它挂在代码的哪一部分?(无限循环),还是刚刚进入某种较长的循环?

我已经多次看到“评论打印语句”错误(实际上是最近一次),并且在挑选出无关紧要的位时,它总是被证明是一开始就应该很明显的事情。所以,慢慢来……尝试开始,踢出程序中不会导致错误消失的部分,然后从那里开始工作。

从提供的信息中真的没有什么可以说的了,抱歉。

编辑:@bambeck - 我没有 g77(也没有 powerMac),所以我不能给你确切的说明(因此我的部分含糊不清),但首先尝试打开编译器诊断开关(g77 /?或 g77 /帮助或类似的东西应该给你一个他们的清单)。让它显示所有警告(应该用类似的措辞),在编译时检查数组边界等等......如果这产生了一些有趣的东西,请发布它。

就这一点而言,您展示的 write 语句本身没有任何问题。

我也不知道循环是否真的是无限的,但它持续了半个多小时。不过,关于保存的内容看起来很有希望……详细说明?

哦,只是突然想到的一些事情。我不确定标准对它的描述,这就是为什么我只是在旁边提到它。有时,当数组未正确初始化(某个值)时,一些编译器会将其设置为零值,而有些编译器只会在存储其内容的位置从内存中随机选择一些东西。我们曾经遇到过类似的问题,它给了我们一些奇怪的结果,这就是我记得它的原因。不是说你有同样的问题。在这些情况下,SAVE 语句可能会引入一些奇怪的行为。

你的结果(当程序“工作”时)在不同的运行(使用相同的输入数据)上是否有所不同?

于 2011-08-11T05:19:51.173 回答
0

1)您通常可以编写一个函数: write(*,*)f(x) 其中函数 f() 可以做任何该死的事情(包括更改 x),因此评论 write 语句确实会更改程序。练习不佳,但可能。

2)您可能有一个完全不相关的错误,例如访问数组越界。对代码进行任何形式的更改都可能导致编译器以不同的方式对齐内存中的变量,从而导致“隐藏”错误导致问题。(打开数组边界检查,检查访问未初始化的变量是个好主意)

于 2011-09-16T17:19:34.347 回答