此代码用于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;
}
答案 0 :(得分:1)
在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
既不保护任何一个因为您访问,您获得了“'RGBTRIPLE [width]类型的索引600超出范围”
image[k][m].rgbtGreen
由于最后一个要点,m
等于width
。
由于此答案中的第一句话,因此被禁止。
您需要的是将循环从0更改为width-1,特别是对于内部循环。为此,我将更改外部循环,使它们从1变为width-2。这时,不需要使用保护性if
,反而会破坏它。应该使用<
而不是<=
。
那么您可能需要特别对待图片边缘。
显然,与高度相关的部分也是如此。