我有一个程序可以遍历一个数组,确定性地生成新的行向量,然后将其附加到数组中。
在每次迭代中,都会采用向量的范数,以确保它不是零向量。如果为零,则程序停止。
有一个错误,第三次迭代会导致向量变为零。
在寻找这个错误时,我用调试打印语句填充代码,print *,"here",this_var 等。这些打印语句之一(打印最新向量的规范)修复了程序。
我不喜欢打印声明。我也不喜欢这样,我不明白发生了什么。
有没有人知道为什么打印语句会影响它正在打印的东西?
可用代码(约 400 行,大量注释)
我有一个程序可以遍历一个数组,确定性地生成新的行向量,然后将其附加到数组中。
在每次迭代中,都会采用向量的范数,以确保它不是零向量。如果为零,则程序停止。
有一个错误,第三次迭代会导致向量变为零。
在寻找这个错误时,我用调试打印语句填充代码,print *,"here",this_var 等。这些打印语句之一(打印最新向量的规范)修复了程序。
我不喜欢打印声明。我也不喜欢这样,我不明白发生了什么。
有没有人知道为什么打印语句会影响它正在打印的东西?
可用代码(约 400 行,大量注释)
正如詹姆斯在评论中指出的那样,这可能是由数组索引引起的。您应该尝试在启用数组边界检查的情况下重新编译代码(执行此操作的命令会因您的编译器而异)并运行程序。
你是绝对正确的——像这样的阴险错误绝对令人抓狂。
由于访问越界,您似乎覆盖了您的记忆。使用数组边界检查进行编译。这会使程序运行速度变慢,但您可以找出内存违规。
有一次,我发现一个与编译器或链接器有关的错误,其结果与此类似。有问题的代码行在多个程序中是相同的,除了这个之外它们都可以工作。在这种情况下,所讨论的行是一个算术如果。当我将它转换为多个标准 if then else 语句时,它可以正常工作。这是极不可能的错误,但我必须把它放在那里。
还必须对蒂姆的回答加分。编译器选项是最重要的。
你使用子程序吗?
有时您在子例程中覆盖了一些数据并且它不会被传播回来,但是结果会丢失。
您在子例程调用中有正确的类型吗?
您是否使用意图输入/输出?
你使用固定尺寸吗?