cs50 过滤器 "blur" pset4
cs50 filter "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+1
,即 heigth
,不正确,if
也不保护
m
达到 j+1
,即 width
,不正确,if
也不保护
您得到“索引 600 超出类型‘RGBTRIPLE [width]”的错误,因为您访问
image[k][m].rgbtGreen
m
等于 width
,因为最后一个要点。
由于此答案的第一句话,这是被禁止的。
您需要将循环从 0 更改为 width-1,尤其是对于内部循环。为此,我会更改外部循环,使它们从 1 变为 width-2。那时保护 if
应该变得不需要了,反正它坏了。它应该使用 <
而不是 <=
.
那么你可能需要对图片边缘进行特殊处理。
显然与身高相关的部分也是如此。
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 变为 width-2。那时保护 if
应该变得不需要了,反正它坏了。它应该使用 <
而不是 <=
.
那么你可能需要对图片边缘进行特殊处理。
显然与身高相关的部分也是如此。