2010-08-12 67 views
1

我有一个程序遍历数组,确定性地制作新的行向量,然后将它添加到数组。Fortran调试打印语句影响程序流程

在每次迭代中,都会采用向量的范数,以确保它不是零向量。如果它为零,则程序停止。

有一个错误,第三次迭代会导致向量归零。

在寻找这个bug时,我用调试打印语句,print *,“here”,this_var等填充了代码。其中一个打印语句(打印最新向量的规范)修复了程序。

我不喜欢打印声明。我也不喜欢我不明白发生了什么事。

有没有人有任何想法,为什么打印声明会影响它正在打印的东西?

代码(〜400线,大量的评论)提供

+5

数组索引超出范围问题可能导致行为更改 – James 2010-08-12 13:51:01

+0

您使用的编译器是什么?我们可能能够建议在调试时使用好的编译器选项。 – 2010-08-12 22:55:15

+0

使用ifort(英特尔),但可以使用gfortran编译,如果有帮助?多谢你们! – Samizdis 2010-08-14 11:16:04

回答

3

正如詹姆斯在评论中指出,这可以通过数组索引引起的。您应该尝试重新编译启用了数组边界检查的代码(执行此操作的命令将因编译器而异)并运行该程序。

你绝对正确 - 像这样的阴险错误是绝对令人发狂。

0

有一次,我发现一个错误与编译器或链接器有类似的结果。有问题的代码行在多个程序中是相同的,除了这个之外,它们都工作正常。在这种情况下,该线路是一个aritmetic如果。当我将它转换为多个标准时,如果其他语句按其应该的方式工作。这是错误的可能性不大,但我必须把它放在那里。
也必须加上Tim的答案。编译器选项非常重要。

+0

我希望,因为他用“Fortran 90”标记了算术if语句无处可查的问题...... – 2010-08-12 21:40:50

1

看起来像你覆盖你的内存,因为访问超出了界限。编译时检查数组边界。这会使程序运行速度变慢,但您可以找出内存违规。

0

你使用子程序吗?

有时您会覆盖子例程中的某些数据,但它不会传回,但结果会丢失。

你在子程序调用中有正确的类型吗?

你使用intent in/out吗?

您是否使用固定尺寸?