2

代码似乎跳过了 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。

谢谢,乔什

4

2 回答 2

1

由于浮点比较,似乎出现了错误。众所周知,浮点比较不是很安全。有关更多信息,请参阅这些:

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

于 2012-07-24T04:55:10.793 回答
1

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

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

于 2012-07-24T16:33:33.187 回答