C - CS50 滤波器 "blur" PSEt4



此代码用于cs50过滤器"模糊";编译,但当我运行它时,它说,index 600 out of bounds for type 'RGBTRIPLE [width].'。我有点理解它的意思,但我不知道为什么它说我超过了数组的限制。

void blur(int height, int width, RGBTRIPLE image[height][width])
{
int counter = 0;
int sumGreen = 0;
int sumRed = 0;
int sumBlue = 0;
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
for (int k = i - 1; k <= i + 1; k++)
{
for (int m = j - 1; m <= j + 1; m++)
{
if (k >= 0 && m >= 0 && k <= height && m <= width)
{
sumGreen += image[k][m].rgbtGreen;
sumBlue += image[k][m].rgbtBlue;
sumRed += image[k][m].rgbtRed;
counter++;
}
}
}
image[i][j].rgbtGreen = sumGreen / counter;
image[i][j].rgbtBlue = sumBlue / counter;
image[i][j].rgbtRed = sumRed / counter;
counter = 0;
sumGreen = 0;
sumBlue = 0;
sumRed = 0;
}
}
return;
}

在C中,即使在CS50中,大小为N的数组也有最高的合法索引N-1,从0开始。

使用您的环路

  • i达到height-1,正确
  • j达到width-1,正确
  • k从-1开始,不正确,但if保护
  • m从-1开始,不正确,但if保护
  • k达到i+1heigth不正确,if也不保护
  • m达到j+1width不正确,if也不保护

;索引600超出了类型"RGBTRIPLE[width]"的界限;因为你访问

image[k][m].rgbtGreen

其中m等于width

这是被禁止的,因为这个答案的第一句话。

您需要的是将循环从0更改为width-1,尤其是内部循环。为此,我会改变外环,使它们从1变为宽度-2。在这一点上,保护if应该变得不需要了,无论如何它都会坏掉。它应该使用<而不是<=
那么您可能需要对图片边缘进行特殊处理
与高度相关的零件显然也是如此。

相关内容

  • 没有找到相关文章

最新更新