2017-05-08 111 views
0

此函數應該逐像素地通過在2n + 1「半徑」內旋轉其周圍顏色平均值上每個像素的顏色來模糊圖像。C - 浮點異常(核心轉儲)

(跳到下一個像素的部分已經實現了,不用擔心)。

我成功編譯這段代碼:

void 
blur_pixels(image *img, pixel *p, size_t i, size_t j) 
{ 
    //i = current height of pixel, j = current width of pixel 
    int side = 2*blurRate+1; 
    int total = 0; 
    int leftRight = i-blurRate; 
    int upDown = j-blurRate; 
    int tmpHr = 0, tmpHg = 0, tmpHb = 0; 

    for(; upDown < j+blurRate; upDown++) { 
    if(upDown >= 0 && upDown < img->height) { 
     for(; leftRight < i+blurRate; leftRight++) { 
     if(leftRight >= 0 && leftRight < img->width) { 
      tmpHr += (p+leftRight)->r; 
      tmpHg += (p+leftRight)->g; 
      tmpHb += (p+leftRight)->b; 
      total++; 
     } 
     } 
    } 
    } 
    p->r=tmpHr/total; 
    p->g=tmpHg/total; 
    p->b=tmpHb/total; 
} 

但是當我運行的代碼,我得到以下異常:

Floating point exception 

有誰知道爲什麼嗎?

+4

確定'循環後total'> 0? – tkausl

+4

可能被零除。使用調試器。 –

+0

可能總數爲0. –

回答

2

代碼是由0與p->r=tmpHr/total;

total預成形師可能爲零,因爲編譯器警告不導通表示for()環路的混合符號/無符號數學。打開所有編譯器警告。

比較upDown < j+blurRate和其他代碼是使用無符號數學完成的,可能不是OP所期望的,並且內部的total++;從不發生。如果upDown < 0,則upDown < j+blurRate中的upDown變爲大的無符號值。然後比較是錯誤的。

size_t j // an unsigned type 
... 
int upDown = j-blurRate; 
... 
for(; upDown < j+blurRate; upDown++) { // not firing 

一個解決方案是隻使用int變量。一個更強大的解決方案將使用無符號數學,但更好的答案需要更多更高級別的代碼。

喜歡的東西:

blur_pixels(image *img, pixel *p, size_t i, size_t j) { 
    //i = current height of pixel, j = current width of pixel 
    size_t side = 2u*blurRate+1; 
    size_t total = 0; 
    size_t leftRight = (i > blurRate) ? i-blurRate : 0; 
    size_t upDown = (j > blurRate) ? j-blurRate : 0; 
    int tmpHr = 0, tmpHg = 0, tmpHb = 0; 

    for(; upDown < j+blurRate; upDown++) { 
    if (upDown < img->height) { 
     // I suspect leftRight needs to be set here each iteration 
     size_t leftRight = (i > blurRate) ? i-blurRate : 0; 
     for(; leftRight < i+blurRate; leftRight++) { 
     if (leftRight < img->width) { 
      tmpHr += (p+leftRight)->r; 
      tmpHg += (p+leftRight)->g; 
      tmpHb += (p+leftRight)->b; 
      total++; 
     } 
     } 
    } 
    } 
    if (total) { 
    p->r = tmpHr/total; 
    p->g = tmpHg/total; 
    p->b = tmpHb/total; 
    } else { 
    p->r = p->g = p->b = 0; 
    } 
}