此代码用于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+1
,heigth
不正确,if
也不保护m
达到j+1
,width
不正确,if
也不保护
;索引600超出了类型"RGBTRIPLE[width]"的界限;因为你访问
image[k][m].rgbtGreen
其中m
等于width
。
这是被禁止的,因为这个答案的第一句话。
您需要的是将循环从0更改为width-1,尤其是内部循环。为此,我会改变外环,使它们从1变为宽度-2。在这一点上,保护if
应该变得不需要了,无论如何它都会坏掉。它应该使用<
而不是<=
那么您可能需要对图片边缘进行特殊处理
与高度相关的零件显然也是如此。