我正在使用旧的FORTRAN 77程序,我遇到了一个奇怪的错误。原样,代码似乎运行良好,并在不到一秒钟内完成。但是它产生了一堆我不感兴趣的无关输出。所以,我进入了源代码,并注释掉了所有额外的WRITE语句。
好吧,当我注释掉一些WRITE语句时,代码似乎运行得慢一点(虽然我不确定;它可能看起来更慢,因为我有更少的文本行滚动来保持我占领了。当我注释掉最后一个额外的WRITE语句时,程序就会挂起,永远不会完成执行。
现在,从逻辑上讲,注释掉一个WRITE语句应该仍然让程序的其余部分完全正常运行,对吧?我认为这意味着在代码中某处隐藏着一些其他问题,并且WRITE语句以某种方式掩盖它(清除缓冲区,可能?)。
一位了解Fortran(少数人之一)的同事建议我可能无意中评论了一个声明标签,但事实并非如此。另一位不了解Fortran,但对编程非常熟练的同事建议说,这对他来说就像一个指针问题,但据我所知,我从未将一个越界索引传递给他数组,我不确定会出现这样的问题。
我正在使用G77在PowerPC Mac计算机上编译程序。
答案 0 :(得分:3)
这听起来很麻木,甚至可能很粗鲁但是......
标准答案1适用于此处 - 如果您了解问题,则不会寻求帮助。如果你想获得不错的帮助,你需要显示实际问题,而不是你对你认为问题的解释。我们无法通过查看不是要调试的代码的东西来调试代码,甚至可能是问题的根源。
所以,显示代码!
- 申报很重要
- 如何编译它,打开了哪些选项?
- 跳出数组边界是编译器在编译时应该捕获的东西
- 是写入屏幕或其他单位(文件)的写声明;是否有机会稍后阅读它?
- 这可能是保存和初始化值的问题吗? (只是在这里猜测)
你说程序“挂起”。您是否尝试过确定它挂起的代码部分? (无限循环),还是刚刚进入某种长循环?
我已经看过几次“评论打印声明”错误(最近一次是最近的事实),并且在挑选出微不足道的位之后,它总是显得非常明显。开始。所以,慢慢来吧......尝试一下,开始执行不会导致错误消失的程序部分,并从那里开始工作。
对于所提供的信息,实际上没有什么可以说的了,抱歉。
编辑:@bambeck - 我没有g77(也不是powerMac),因此我无法向您提供准确的说明(因此我的模糊性),但是一开始尝试打开编译器诊断开关(g77 /?或g77 / help或类似的东西应该给你一个列表)。启用它来显示所有警告(它应该是这样的措辞),在编译时检查数组边界等等......如果它产生了一些有趣的,请发布它。
对于您所显示的写入语句,本身没有任何错误,就此而言。
我也不知道循环是否真的无限,但是它持续了半个多小时。关于保存的一点看起来很有希望,但是......精心设计?
哦,只是想到了一些事情。我不确定标准所说的是什么,这就是我刚才提到的原因。有时,当数组未正确初始化(某些值)时,某些编译器会将其设置为零值,而有些编译器只会从存储器中存储内容的位置随机选取一些内容。我们曾经遇到类似问题的问题,它给了我们一些奇怪的结果,这就是我记得它的原因。不是说你有同样的问题。在这些情况下,SAVE声明可能会引入一些奇怪的行为。
您的结果(当程序“工作”时)在不同的运行中(使用相同的输入数据)是否会有所不同?
答案 1 :(得分:0)
1)你通常可以编写一个函数:write(*,*)f(x)其中函数f()执行任何虚假的事情(包括更改x),以便对write语句进行注释确实会改变程序。做法不好,但可能。
2)你可能有一个完全不相关的错误,比如让一个数组越过界限。对代码进行任何类型的更改都可能导致编译器以不同方式对齐内存中的变量,从而导致“隐藏”错误导致问题。 (打开数组边界检查,并检查是否有未初始化的变量是个好主意)