我似乎无法弄清楚为什么这个错误不断发生。我对编码还很陌生,该程序应该使用盒式模糊对图像进行模糊处理,但是在尝试执行该程序时出现错误。我知道这可能不是最有效的解决方案,但是任何有关如何使它工作的提示都将不胜感激!
void blur(int height, int width, RGBTRIPLE image[height][width])
{
RGBTRIPLE old[height][width];
for(int i = 0; i < height; i++)
{
for(int j = 0; j < width; j++)
{
old[i][j] = image[i][j];
}
}
for(int i = 0; i < height; i++)
{
for(int j = 0; j < width; j++)
{
//top left corner
if(j == 0 && i == 0)
{
image[i][j].rgbtRed = round( (old[i][j].rgbtRed + old[i][j+1].rgbtRed + old[i+1][j].rgbtRed + old[i+1][j+1].rgbtRed) /4);
image[i][j].rgbtGreen = round( (old[i][j].rgbtGreen + old[i][j+1].rgbtGreen + old[i+1][j].rgbtGreen + old[i+1][j+1].rgbtGreen) /4);
image[i][j].rgbtBlue = round( (old[i][j].rgbtBlue + old[i][j+1].rgbtBlue + old[i+1][j].rgbtBlue + old[i+1][j+1].rgbtBlue) /4);
}
//top right corner
else if(j == width && i == 0)
{
image[i][j].rgbtRed = round( (old[i][j].rgbtRed + old[i][j-1].rgbtRed + old[i+1][j].rgbtRed + old[i+1][j-1].rgbtRed) /4);
image[i][j].rgbtGreen = round( (old[i][j].rgbtGreen + old[i][j-1].rgbtGreen + old[i+1][j].rgbtGreen + old[i+1][j-1].rgbtGreen) /4);
image[i][j].rgbtBlue = round( (old[i][j].rgbtBlue + old[i][j-1].rgbtBlue + old[i+1][j].rgbtBlue + old[i+1][j-1].rgbtBlue) /4);
}
//bottom left corner
else if(j == 0 && i == height - 1)
{
image[i][j].rgbtRed = round( (old[i][j].rgbtRed + old[i][j+1].rgbtRed + old[i-1][j].rgbtRed + old[i-1][j+1].rgbtRed) /4);
image[i][j].rgbtGreen = round( (old[i][j].rgbtGreen + old[i][j+1].rgbtGreen + old[i-1][j].rgbtGreen + old[i-1][j+1].rgbtGreen) /4);
image[i][j].rgbtBlue = round( (old[i][j].rgbtBlue + old[i][j+1].rgbtBlue + old[i-1][j].rgbtBlue + old[i-1][j+1].rgbtBlue) /4);
}
//bottom right corner
else if(j == width && i == height - 1)
{
image[i][j].rgbtRed = round( (old[i][j].rgbtRed + old[i][j-1].rgbtRed + old[i-1][j].rgbtRed + old[i-1][j-1].rgbtRed) /4);
image[i][j].rgbtGreen = round( (old[i][j].rgbtGreen + old[i][j-1].rgbtGreen + old[i-1][j].rgbtGreen + old[i-1][j-1].rgbtGreen) /4);
image[i][j].rgbtBlue = round( (old[i][j].rgbtBlue + old[i][j-1].rgbtBlue + old[i-1][j].rgbtBlue + old[i-1][j-1].rgbtBlue) /4);
}
//first row
else if(i == 0 && j > 0 && j < width - 1)
{
image[i][j].rgbtRed = round( (old[i][j].rgbtRed + old[i][j+1].rgbtRed + old[i+1][j].rgbtRed + old[i+1][j+1].rgbtRed + old[i][j-1].rgbtRed + old[i+1][j-1].rgbtRed) /6);
image[i][j].rgbtGreen = round( (old[i][j].rgbtGreen + old[i][j+1].rgbtGreen + old[i+1][j].rgbtGreen + old[i+1][j+1].rgbtGreen + old[i][j-1].rgbtGreen + old[i+1][j-1].rgbtGreen) /6);
image[i][j].rgbtBlue = round( (old[i][j].rgbtBlue + old[i][j+1].rgbtBlue + old[i+1][j].rgbtBlue + old[i+1][j+1].rgbtBlue + old[i][j-1].rgbtBlue + old[i+1][j-1].rgbtBlue) /6);
}
//last row
else if(i == height && j > 0 && j < width - 1)
{
image[i][j].rgbtRed = round( (old[i][j].rgbtRed + old[i][j+1].rgbtRed + old[i-1][j].rgbtRed + old[i-1][j+1].rgbtRed + old[i][j-1].rgbtRed + old[i-1][j-1].rgbtRed) /6);
image[i][j].rgbtGreen = round( (old[i][j].rgbtGreen + old[i][j+1].rgbtGreen + old[i-1][j].rgbtGreen + old[i-1][j+1].rgbtGreen + old[i][j-1].rgbtGreen + old[i-1][j-1].rgbtGreen) /6);
image[i][j].rgbtBlue = round( (old[i][j].rgbtBlue + old[i][j+1].rgbtBlue + old[i-1][j].rgbtBlue + old[i-1][j+1].rgbtBlue + old[i][j-1].rgbtBlue + old[i-1][j-1].rgbtBlue) /6);
}
//first column
else if(j == 0 && i > 0 && i < height - 1)
{
image[i][j].rgbtRed = round( (old[i][j].rgbtRed + old[i][j+1].rgbtRed + old[i+1][j].rgbtRed + old[i+1][j+1].rgbtRed + old[i-1][j].rgbtRed + old[i-1][j+1].rgbtRed) /6);
image[i][j].rgbtGreen = round( (old[i][j].rgbtGreen + old[i][j+1].rgbtGreen + old[i+1][j].rgbtGreen + old[i+1][j+1].rgbtGreen + old[i-1][j].rgbtGreen + old[i-1][j+1].rgbtGreen) /6);
image[i][j].rgbtBlue = round( (old[i][j].rgbtBlue + old[i][j+1].rgbtBlue + old[i+1][j].rgbtBlue + old[i+1][j+1].rgbtBlue + old[i-1][j].rgbtBlue + old[i-1][j+1].rgbtBlue) /6);
}
//last column
else if(j == width && i > 0 && i < height - 1)
{
image[i][j].rgbtRed = round( (old[i][j].rgbtRed + old[i][j-1].rgbtRed + old[i+1][j].rgbtRed + old[i+1][j-1].rgbtRed + old[i-1][j].rgbtRed + old[i-1][j-1].rgbtRed) /6);
image[i][j].rgbtGreen = round( (old[i][j].rgbtGreen + old[i][j-1].rgbtGreen + old[i+1][j].rgbtGreen + old[i+1][j-1].rgbtGreen + old[i-1][j].rgbtGreen + old[i-1][j-1].rgbtGreen) /6);
image[i][j].rgbtBlue = round( (old[i][j].rgbtBlue + old[i][j-1].rgbtBlue + old[i+1][j].rgbtBlue + old[i+1][j-1].rgbtBlue + old[i-1][j].rgbtBlue + old[i-1][j-1].rgbtBlue) /6);
}
else if(i < height - 1 && j < width - 1)
{
image[i][j].rgbtRed = round( (old[i][j].rgbtRed + old[i][j+1].rgbtRed + old[i+1][j].rgbtRed + old[i+1][j+1].rgbtRed + old[i][j-1].rgbtRed + old[i+1][j-1].rgbtRed + old[i-1][j].rgbtRed + old[i-1][j-1].rgbtRed + old[j-1][i+1].rgbtRed) /9);
image[i][j].rgbtGreen = round( (old[i][j].rgbtGreen + old[i][j+1].rgbtGreen + old[i+1][j].rgbtGreen + old[i+1][j+1].rgbtGreen + old[i][j-1].rgbtGreen + old[i+1][j-1].rgbtGreen + old[i-1][j].rgbtGreen + old[i-1][j-1].rgbtGreen + old[j-1][i+1].rgbtGreen) /9);
image[i][j].rgbtBlue = round( (old[i][j].rgbtBlue + old[i][j+1].rgbtBlue + old[i+1][j].rgbtBlue + old[i+1][j+1].rgbtBlue + old[i][j-1].rgbtBlue + old[i+1][j-1].rgbtBlue + old[i-1][j].rgbtBlue + old[i-1][j-1].rgbtBlue + old[j-1][i+1].rgbtBlue) /9);
}
}
}
}
UndefinedBehaviorSanitizer:DEADLYSIGNAL
==9889==ERROR: UndefinedBehaviorSanitizer: SEGV on unknown address 0x7fff298bd0b8 (pc 0x000000442a96 bp 0x7fff298bc2b0 sp 0x7fff298071c0 T9889)
==9889==The signal is caused by a READ memory access.
#0 0x442a95 (/home/ubuntu/pset4/filter/filter+0x442a95)
#1 0x4232f1 (/home/ubuntu/pset4/filter/filter+0x4232f1)
#2 0x7f302ce5db96 (/lib/x86_64-linux-gnu/libc.so.6+0x21b96)
#3 0x402e19 (/home/ubuntu/pset4/filter/filter+0x402e19)
UndefinedBehaviorSanitizer can not provide additional info.
==9889==ABORTING
“我似乎无法弄清楚为什么这个错误不断发生。”
(关于异常信号:==9889==The signal is caused by a READ memory access.
)
尽管我同意其他答案中提供的建议,但是它不能解决您所询问的核心问题,这很可能是由于代码中未定义的行为引起的。
注意:错误声明:signal is caused by a READ memory access.
是未定义行为(UB)的症状,我最喜欢的定义与您所看到的有关。具体来说,您的代码在某些时候正试图写入它不拥有的内存。如果要写入的未拥有的内存碰巧被任何其他进程所拥有,那么您的程序甚至可能不会引发异常。但是,在您的情况下,您的进程不拥有的内存很可能是由另一个进程拥有的,从而导致OS发出投诉并发出异常信号,表明您侵入了另一个人的属性(内存位置)。
有趣的是,您发布的代码没有明显的迹象表明分配正在尝试访问未拥有的内存。绑定所有分配的嵌套循环的条件:
for(int i = 0; i < height; i++)
{
for(int j = 0; j < width; j++)
显然不允许i
或j
索引超出image
数组的边界。以及随后的语句,例如:
else if(j == width && i == 0)
通过在条件for循环绝不允许有保证j == width
,从而防止什么本来试图例如写入image[i][j].rgbtRed
(其中,如果j == width
将放在一个阵列存储器位置是否越界。),并作为异常的原因。
因此,我建议可能由于未发布代码而发生异常。(您从未在错误的确切位置的注释中回答问题。)您尚未找到它。对您来说,这是一个非常好的举动,以发现根本原因,无论其原因在哪里,并将其消除。
或者,您可以发布一个最小但完整的可编译示例,从而更好地使其他访问此帖子的人可以帮助您找到它。
编辑 -我只用一个main()
函数就可以运行您的代码(请参见下文),但在您发布的代码片段中没有发现读取内存访问冲突的迹象。我坚信在这一点上问题出在其他地方,也许在一段代码中您没有包括:
typedef struct {
int rgbtRed;
int rgbtGreen;
int rgbtBlue;
}RGBTRIPLE;
void blur(int height, int width, RGBTRIPLE image[height][width]);
int main(void)
{
RGBTRIPLE image[2][3] = {{{12,13,14},{14,15,16},{15,16,17}},{{16,17,18},{17,18,19},{18,19,20}}};
blur(2, 3, image);
return 0;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句