CS50过滤器“模糊” pset4

时间:2020-07-31 02:54:44

标签: c filter cs50 blur

此代码用于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;
}

1 个答案:

答案 0 :(得分:1)

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

循环播放

  • i起床到height-1,正确
  • j起床到width-1,正确
  • k从-1开始,不正确,但是if保护着
  • m从-1开始,不正确,但是if保护着
  • ki+1为止的heigth错误,并且if既不保护任何一个
  • mj+1为止的width错误,并且if既不保护任何一个

因为您访问,您获得了“'RGBTRIPLE [width]类型的索引600超出范围”

image[k][m].rgbtGreen

由于最后一个要点,m等于width

由于此答案中的第一句话,因此被禁止。

您需要的是将循环从0更改为width-1,特别是对于内部循环。为此,我将更改外部循环,使它们从1变为width-2。这时,不需要使用保护性if,反而会破坏它。应该使用<而不是<=
那么您可能需要特别对待图片边缘。
显然,与高度相关的部分也是如此。