【问题标题】:Filter Reflection, cs50 - What is wrong with the code? More info regarding my question in comments [closed]过滤反射,cs50 - 代码有什么问题?有关我在评论中的问题的更多信息[关闭]
【发布时间】:2022-01-15 00:42:57
【问题描述】:
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;
}

【问题讨论】:

  • 嗨,我正在为 cs50 做这个 pset4,我目前正在参与“反射”。我想出了一个看似可行的解决方案,但在运行 check50 时我返回错误。为什么?当然,我的代码可能设计得不是很漂亮,但它会按原样返回所有测试照片的反射输出,但仍然没有通过 check50。我创建了一个 typedef 结构来存储临时像素颜色,然后我将它们以相反的顺序再次放入。 typedef struct { BYTE 红色;字节绿色;字节蓝; } temp_array;
  • "但是我在运行 check50 时返回错误。为什么?"因为一个或多个特定的测试用例失败了。如果您查看测试用例、预期的输出和错误的输出,您应该能够将相同的数据输入到您的程序中并逐步通过 debuffer。
  • 为什么要创建一个新的typedef?有一种类型可以用于此目的:RGBTRIPLE 使用它。
  • 一些提示:temp[width - i] 该索引在该循环中的范围是多少?在您将值设置为temp 的循环中,它将具有什么范围?什么范围对您的数组定义有效?此外,对于交换 2 个像素,您不应复制整行,而只需使用 1 个单个临时变量。顺便说一句:您可以在一次分配中分配整个结构。无需单独分配每个字段。
  • 最后:请将评论中的文字添加到帖子中。

标签: c cs50


【解决方案1】:

在您的循环中复制像素时存在偏离 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 个元素。不是存储一整行的arra。

也不要为已经存在的事物发明新的类型。您交换RGBTRIPLE 类型的像素。使用那种类型。不要添加其他类型来重新发明轮子。

要交换一个像素,只需使用这个:

           RGBTRIPLE temp = image[row][j];
           image[row][j] = image[row][width-1-j];
           image[row][width-1-j] = temp;

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

【讨论】:

  • 我现在明白了,感谢您的帮助!我改为使用交换功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-11
  • 1970-01-01
  • 2023-04-01
  • 2014-12-07
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
相关资源
最近更新 更多