我正在尝试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;
}
答案 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