PSET4:过滤器(较少)

时间:2020-07-15 00:48:27

标签: arrays c debugging cs50 edx

我正在尝试Pset4的Filter问题(不太舒服)。我在下面编写了此代码以反映图像。但这根本不起作用。它可以编译。

// Reflect image horizontally
void reflect(int height, int width, RGBTRIPLE image[height][width])
{
    for (int i = 0; i < height; i++)  //for rows
    {
        int start = 0;
        for (int end = width; end > 0; end--)
        {
            BYTE tempR, tempB, tempG;
            if(start < end)
            {
                tempR = image[i][start].rgbtRed;
                tempB = image[i][start].rgbtBlue;
                tempG = image[i][start].rgbtGreen;
                image[i][start].rgbtRed = image[i][end].rgbtRed;
                image[i][start].rgbtBlue = image[i][end].rgbtBlue;
                image[i][start].rgbtGreen = image[i][end].rgbtGreen;
                image[i][end].rgbtRed = tempR;
                image[i][end].rgbtBlue = tempB;
                image[i][end].rgbtGreen = tempG;
                start += 1;
            }
        }
    }
    return;
}

1 个答案:

答案 0 :(得分:3)

在看到注释之前,根据代码,这看起来像是“颠倒[光栅]行上所有像素的顺序”。

一些问题...

end应该以{{1​​}}开头,并且 not width - 1]开始。它从过去行的最后一个像素(即下一个行的第一个像素)开始。对于最后一行,这是UB [未定义行为]。

所以,结果是移动了一个像素,我敢打赌,该行的第一个和最后一个像素看起来“很有趣” ...

内部循环条件应为width而不是start < end,我们应该完全消除end > 0

除了正确性之外,这还将消除内部循环的最后50%。那些不是正在传输数据[因为if (start < end)将变为假,并且对于其余的行仍然如此]。因此,该循环执行的循环迭代次数是原来的两倍,即只有第一个循环才能完成有用的工作。

换句话说,内部if循环正在进行for迭代,而不是width迭代。


这是经过清理和更正的代码:

width / 2

尽管优化器 可以从上面生成高效的代码,但这是其中// Reflect image horizontally void reflect(int height, int width, RGBTRIPLE image[height][width]) { // for rows for (int i = 0; i < height; i++) { int start = 0; for (int end = width - 1; start < end; --end, ++start) { BYTE tempR, tempB, tempG; tempR = image[i][start].rgbtRed; tempB = image[i][start].rgbtBlue; tempG = image[i][start].rgbtGreen; image[i][start].rgbtRed = image[i][end].rgbtRed; image[i][start].rgbtBlue = image[i][end].rgbtBlue; image[i][start].rgbtGreen = image[i][end].rgbtGreen; image[i][end].rgbtRed = tempR; image[i][end].rgbtBlue = tempB; image[i][end].rgbtGreen = tempG; } } } start是指针的版本。这使编译器更容易理解意图,并且更加简单易懂:

end