2017-05-08 5 views
0

Diese Funktion soll Pixel für Pixel das Bild verwischen, indem die Farbe jedes Pixels um den Mittelwert der Farben in einem 2n + 1 "Radius" gedreht wird.C - Gleitkommaausnahme (core dumped)

(Der Teil, der zum nächsten Pixel springt, ist bereits implementiert, keine Sorge).

ich diesen Code erfolgreich kompiliert:

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; 
} 

Aber wenn ich den Code, den ich die folgende Ausnahme erhalten laufen:

Floating point exception 

Wer weiß, warum?

+4

Sind Sie sicher, dass 'total'> 0 nach der Schleife? – tkausl

+4

Wahrscheinlich Division durch Null. Verwenden Sie einen Debugger. –

+0

Wahrscheinlich ist insgesamt 0. –

Antwort

2

-Code wird von 0 mit p->r=tmpHr/total;

total Division Vorformen ist wahrscheinlich Null, da Compiler-Warnungen werden die gemischte zu zeigen mit/ohne Vorzeichen Mathematik der for() Schleife nicht eingeschaltet. Aktivieren Sie alle Compilerwarnungen.

Der Vergleich upDown < j+blurRate und anderer Code ist mit unsigned Mathe, wahrscheinlich nicht so wie OP erwartet und die innere total++; passiert nie getan. Wenn upDown < 0, dann upDown in upDown < j+blurRate wird ein großer vorzeichenloser Wert. Dann ist der Vergleich falsch.

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

Eine Lösung wäre nur int Variablen zu verwenden sein. Eine robustere Lösung würde unsignierte Mathematik verwenden, für eine gute Antwort wäre jedoch mehr Code auf höherer Ebene erforderlich.

Etwas wie:

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; 
    } 
} 
Verwandte Themen