cs50 pset反射滤光片

vwoqyblh  于 2023-06-21  发布在  其他
关注(0)|答案(1)|浏览(115)

我试图解决反射过滤器在CS50第4周pset,但我卡住了。我的逻辑是使用RGBTRIPLE类型的缓冲区将整个图像中的最后一个像素从image[n][width - 1]复制到第一个像素image[n][n]。但是,我的代码似乎有些问题:

void reflect(int height, int width, RGBTRIPLE image[height][width])
{
    for (int h = 0; h < height; h++)
    {
        RGBTRIPLE buffer;
        for (int w = 0; w < width; w++)
        {
            buffer = image[h][w];
            image[h][w] = image[h][width - w];
            image[h][width - w] = buffer;
        }
    }
    return;
}
aiqt4smr

aiqt4smr1#

你的代码是不正确的,至少因为当h等于height - 1并且w等于0时,这个表达式image[h][width - w]可以访问图像以外的内存,因为数组中一行的有效索引范围是[0, width)
但是即使你使用表达式image[h][width - w - 1]循环

for (int w = 0; w < width; w++)

结果将形成相同的原始行。
如果你想反转图像的每一行,那么函数可以如下所示

void reflect( size_t height, size_t width, RGBTRIPLE image[height][width] )
{
    for ( size_t h = 0; h < height; h++ )
    {
        for ( size_t w = 0; w < width / 2; w++ )
        {
            RGBTRIPLE buffer;
            buffer = image[h][w];
            image[h][w] = image[h][width - w - 1];
            image[h][width - w - 1] = buffer;
        }
    }
}

相关问题