2012-07-24 119 views
2

代碼似乎跳過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

回答

1

外部二維數組modSED一個很詳細的說明了錯誤的宣佈維度(與初始化的c文件不同),所以程序,gdb或者兩者都會感到困惑。修正宣言的尺寸解決了問題。 (這裏的問題指的是我從modSED返回的正確值沒有得到的更大的問題。)由於GDB似乎給出了錯誤的輸出,但是,我被掛在代碼的錯誤部分。

也許這反過來導致GDB看起來違抗邏輯並跳過while循環? (現在運行該程序,GDB不會增加j並顯示它已經完成了。)

1

似乎是一個錯誤攀升是由於浮點比較。衆所周知,浮點比較不是很安全。請參閱這些更多的信息:

第二個環節對浮點運算

+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