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 应该变得不需要了,反正它坏了。它应该使用 < 而不是 <=.
那么你可能需要对图片边缘进行特殊处理。
显然与身高相关的部分也是如此。