C - 浮点异常(核心转储)
C - Floating Point Exception (core dumped)
这个函数应该通过在 2n+1 "radius".
中将每个像素的颜色变为周围颜色的平均值来逐个像素地模糊图像。
(跳到下一个像素的部分已经实现了,不用担心)
我成功编译了这段代码:
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
有人知道为什么吗?
代码正在使用 p->r=tmpHr/total;
除以 0
total
可能为零,因为未打开编译器警告显示 for()
循环的混合 signed/unsigned 数学。打开所有编译器警告。
比较 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;
}
}
这个函数应该通过在 2n+1 "radius".
中将每个像素的颜色变为周围颜色的平均值来逐个像素地模糊图像。(跳到下一个像素的部分已经实现了,不用担心)
我成功编译了这段代码:
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
有人知道为什么吗?
代码正在使用 p->r=tmpHr/total;
total
可能为零,因为未打开编译器警告显示 for()
循环的混合 signed/unsigned 数学。打开所有编译器警告。
比较 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;
}
}