C程序似乎跳过while循环

C程序似乎跳过while循环

问题描述:

代码似乎跳过while循环:C程序似乎跳过while循环

int i,j; 
i= floor((Lx-23.61)/0.1); 
j=0; 
while(Nh - modSED[i][j] > 0.0){ 
    j++; 
} 
if(j>0 && modSED[i][j]-Nh > Nh-modSED[i][j-1]){ 
    fileNH=modSED[i][j-1]; 
}else{ 
    fileNH=modSED[i][j]; 
} 

它或多或少通过double数组(第i索引由的另一部分预设的粗线性搜索代码,不应该是一个问题)。该代码似乎当我看着GDB胡作非为:

Breakpoint 1, mag (filter=4, Lx=23.930108812418158, z=0.57071772467724535, Nh=0.011911981460606383) at infopt.c:45 
45  while(Nh-modSED[i][j]>0.0){ 
(gdb) print Nh-modSED[i][j] 
$1 = 0.001911981460606383 
(gdb) n 
48  if(j>0 && modSED[i][j]-Nh > Nh-modSED[i][j-1]){ 
(gdb) 

,它刚刚跳过J ++段,即使while循环应该评估为true。

感谢, 乔希

+1

您是否已优化开启('-O')?如果是这样,请禁用并重试。优化混淆了调试器。 – 2012-07-24 04:53:07

+0

你可能也希望将类型转换为int,因为floor函数返回一个double而不是一个整数,并且数组不能被索引为 – Alex 2012-07-24 04:54:59

+0

我的cflags是CFLAGS = -g3 -std = c99 -Wall -I $(IDIR)in the makefile,所以没有优化。尝试了类型转换,并没有改变行为。 – jroz 2012-07-24 04:57:33

外部二维数组modSED一个很详细的说明了错误的宣布维度(与初始化的c文件不同),所以程序,gdb或者两者都会感到困惑。修正宣言的尺寸解决了问题。 (这里的问题指的是我从modSED返回的正确值没有得到的更大的问题。)由于GDB似乎给出了错误的输出,但是,我被挂在代码的错误部分。

也许这反过来导致GDB看起来违抗逻辑并跳过while循环? (现在运行该程序,GDB不会增加j并显示它已经完成了。)

似乎是一个错误攀升是由于浮点比较。众所周知,浮点比较不是很安全。请参阅这些更多的信息:

第二个环节对浮点运算

+0

我在想这样的事情,但0.002并不是非常小,而且gdb甚至说while循环的计算结果为true。然后跳过它(我没有将它包括在上面,但是我告诉gdb“打印Nh-modSED [i] [j]> 0”,并且结果为“1”。 – jroz 2012-07-24 05:01:19

+0

这个特殊问题不太可能浮点相关,浮点比较'> 0.0'非常明确。 – 2012-07-24 09:09:43