过滤器反射,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;

然后删除所有未使用的类型、数组和循环。