过滤器反射,cs50 - 代码有什么问题?有关我在评论中的问题的更多信息
Filter Reflection, cs50 - What is wrong with the code? More info regarding my question in comments
void reflect(int height, int width, RGBTRIPLE image[height][width]) {
temp_array temp[width];
int row;
for (row = 0; row < height; row++)
{
for (int j = 0; j < width; j++)
{
temp[j].red = image[row][j].rgbtRed;
temp[j].green = image[row][j].rgbtGreen;
temp[j].blue = image[row][j].rgbtBlue;
}
for (int i = 0; i < width; i++)
{
image[row][i].rgbtRed = temp[width - i].red;
image[row][i].rgbtGreen = temp[width - i].green;
image[row][i].rgbtBlue = temp[width - i].blue;
}
}
return;
}
您在复制像素的循环中遇到 off-by-1 问题。
为了演示目的,我对其进行了一些简化。
RGBTRIPLE *current_row = image[row];
for (int j = 0; j < width; j++)
{
temp[j].red = current_row[j].rgbtRed;
}
for (int i = 0; i < width; i++)
{
current_row[i].rgbtRed = temp[width - i].red;
}
您将 row[0]
复制到 temp[0]
。所有元素都相同,直到 width-1
;
然后你将temp[width-0]
复制到row[0]
。但是您的数组 temp
不包含元素 width
,因为它只有元素 0 .. width-1
。
像素应该取自 row[width - 1 - i]
。
这将避免在复制过程中将像素移动 1 个位置。
它还将避免访问您的数组超出其最大限制,这会导致未定义的行为。
此外,您的代码效率很低。您正在消耗太多内存。
你的任务是交换像素。在大多数情况下,为了交换某些东西,您不需要超过 1 个元素。不是存储整行的数组。
也不要为已经存在的事物发明新类型。您交换 RGBTRIPLE
类型的像素。使用该类型。别再另加一个类型来重新发明轮子
要交换像素,只需使用这个:
RGBTRIPLE temp = image[row][j];
image[row][j] = image[row][width-1-j];
image[row][width-1-j] = temp;
然后删除所有未使用的类型、数组和循环。
void reflect(int height, int width, RGBTRIPLE image[height][width]) {
temp_array temp[width];
int row;
for (row = 0; row < height; row++)
{
for (int j = 0; j < width; j++)
{
temp[j].red = image[row][j].rgbtRed;
temp[j].green = image[row][j].rgbtGreen;
temp[j].blue = image[row][j].rgbtBlue;
}
for (int i = 0; i < width; i++)
{
image[row][i].rgbtRed = temp[width - i].red;
image[row][i].rgbtGreen = temp[width - i].green;
image[row][i].rgbtBlue = temp[width - i].blue;
}
}
return;
}
您在复制像素的循环中遇到 off-by-1 问题。 为了演示目的,我对其进行了一些简化。
RGBTRIPLE *current_row = image[row];
for (int j = 0; j < width; j++)
{
temp[j].red = current_row[j].rgbtRed;
}
for (int i = 0; i < width; i++)
{
current_row[i].rgbtRed = temp[width - i].red;
}
您将 row[0]
复制到 temp[0]
。所有元素都相同,直到 width-1
;
然后你将temp[width-0]
复制到row[0]
。但是您的数组 temp
不包含元素 width
,因为它只有元素 0 .. width-1
。
像素应该取自 row[width - 1 - i]
。
这将避免在复制过程中将像素移动 1 个位置。
它还将避免访问您的数组超出其最大限制,这会导致未定义的行为。
此外,您的代码效率很低。您正在消耗太多内存。 你的任务是交换像素。在大多数情况下,为了交换某些东西,您不需要超过 1 个元素。不是存储整行的数组。
也不要为已经存在的事物发明新类型。您交换 RGBTRIPLE
类型的像素。使用该类型。别再另加一个类型来重新发明轮子
要交换像素,只需使用这个:
RGBTRIPLE temp = image[row][j];
image[row][j] = image[row][width-1-j];
image[row][width-1-j] = temp;
然后删除所有未使用的类型、数组和循环。