2017-05-08 12 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 

誰もがなぜ知っていますか?コンパイラの警告がfor()ループの混合符号付き/符号なしの計算を示すオンにされていないため

+4

あなたは 'total'はループの後に> 0であることを確認していますか? – tkausl

+4

おそらくゼロ除算。デバッガを使用します。 –

+0

おそらく合計は0です。 –

答えて

2

コードp->r=tmpHr/total;

totalで0による除算を予備成形される可能性がゼロです。すべてのコンパイラの警告をオンにします。

upDown < j+blurRateと他のコードは符号なし演算を使用しているため、OPが期待していない可能性があり、total++;は発生しません。 upDown < 0の場合、upDownupDown < j+blurRateに大きな符号なしの値になります。次に、比較は偽です。

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

1つの解決策は、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; 
    } 
} 
関連する問題