C程序似乎在循环时跳过

时间:2012-07-24 04:50:53

标签: c gdb double

代码似乎跳过了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];
}

它或多或少是通过一系列双精度的粗略线性搜索(i-index由代码的另一部分预设,应该不是问题)。当我查看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。

谢谢, 约什

2 个答案:

答案 0 :(得分:1)

看起来像是由于浮点比较而导致的错误。众所周知,浮点比较不是很安全。有关详细信息,请参阅以下内容:

第二个链接有关于浮点运算的非常详细的解释

答案 1 :(得分:1)

外部2D数组modSED声明的尺寸错误(与初始化的c文件不同),因此程序,gdb或两者都混淆了。修复声明的维度解决了问题。 (这里的问题指的是更大的问题,我没有从modSED返回正确的值。)因为GDB似乎提供了错误的输出,但是,我被挂在代码的错误部分。

也许这反过来导致GDB似乎无视逻辑并跳过while循环? (现在运行程序,GDB可以毫不费力地增加j并显示它已经这样做了。)

相关问题