【问题标题】:Reflect Filter-less CS50无反射滤镜 CS50
【发布时间】:2022-12-11 16:35:17
【问题描述】:

目前,我正在做 pset4 filter-less,反思我编写的代码并为此苦苦挣扎。它编译得很好,但输出图片看起来和输入图片一模一样。我试图首先将反射图像存储在一个临时数组中并将其传输到图像数组。我找不到任何尝试过类似方法的人。这是我到目前为止所写的。

void reflect(int height, int width, RGBTRIPLE image[height][width])
{
    int i;                              //row
    int j;                              //column for img
    int z;                              //column of tmp img
    RGBTRIPLE tmpi[height][width];      //tmp img
    for (i = 0; i < height; i++)
    {
        for (j = 0, z = width; j > z; j++, z--)
        {
            image[i][j].rgbtRed = tmpi[i][z].rgbtRed;
            image[i][j].rgbtBlue = tmpi[i][z].rgbtBlue;
            image[i][j].rgbtGreen = tmpi[i][z].rgbtGreen;
        }
    }
    for (i = 0; i < height; i ++)
    {
        for (j = 0; j < width; j++)
        {
            tmpi[i][j].rgbtRed = image[i][j].rgbtRed;
            tmpi[i][j].rgbtBlue = image[i][j].rgbtBlue;
            tmpi[i][j].rgbtGreen = image[i][j].rgbtGreen;
        }
    }
    return;
}

你能帮帮我吗?

【问题讨论】:

  • 欢迎来到 SO。您首先将未初始化的 tmpi 数组复制到原始数组中。这也会用垃圾填充 image 数组。然后你不加任何修改地复制回来。这没有任何意义,因为之后根本没有使用tmpi
  • 关于:for (j = 0, z = width; j &gt; z; j++, z--)j被初始化为小于z的b,所以循环永远不会迭代

标签: c cs50 reflect


【解决方案1】:

你有 2 个错误:

  1. 您首先复制未初始化的内存。
        for (i = 0; i < height; i++)
        {
            for (j = 0, z = width; j > z; j++, z--)
            {
                image[i][j].rgbtRed = tmpi[i][z].rgbtRed;
    

    数组 tmpi 包含不确定的值,因为您从未为其分配任何内容。

    您首先需要将数组复制到tmpi,然后才能将其复制回来。

    1. 您对循环的限制是错误的:
            for (j = 0, z = width; j > z; j++, z--)
            {
                image[i][j].rgbtRed = tmpi[i][z].rgbtRed;
                ...
    
    • 这里,z最多只能达到width-1
    • j&gt;z 是错误的条件。这永远不会是真的。
    • 正确的条件是j&lt;width
    • 不是错误,但您并不真正需要z。只需使用width-j-1
    • 也不是错误,但不需要复制结构的每个成员。您可以一次分配整个结构。

    固定版本如下所示:

    void reflect(int height, int width, RGBTRIPLE image[height][width])
    {
        int i;                              //row
        int j;                              //column for img
    
        RGBTRIPLE tmpi[height][width];      //tmp img
    
        for (i = 0; i < height; i ++)
        {
            for (j = 0; j < width; j++)
            {
                tmpi[i][j] = image[i][j];
            }
        }
    
    
        for (i = 0; i < height; i++)
        {
            for (j = 0; j < width; j++)
            {
                image[i][j] = tmpi[i][width - j - 1];
            }
        }
        return;
    }
    

    或者你甚至可以组合外部循环:

    void reflect(int height, int width, RGBTRIPLE image[height][width])
    {
        int i;                              //row
        int j;                              //column for img
    
        RGBTRIPLE tmpi[height][width];      //tmp img
    
        for (i = 0; i < height; i ++)
        {
            for (j = 0; j < width; j++)
            {
                tmpi[i][j] = image[i][j];
            }
    
            for (j = 0; j < width; j++)
            {
                image[i][j] = tmpi[i][width - j - 1];
            }
        }
        return;
    }
    

    或者您可以就地交换值:

    void reflect(int height, int width, RGBTRIPLE image[height][width])
    {
        int i;                              //row
        int j;                              //column for img
    
        for (i = 0; i < height; i ++)
        {
            for (j = 0; j < width / 2; j++)
            {
                RGBTRIPLE temp = image[i][j];
                image[i][j] = image[i][width - j - 1];
                image[i][width - j - 1] = temp;
            }
        }
        return;
    }
    

    一旦它正常工作,请随意考虑更多优化。

【讨论】:

  • 感谢你的回答。关于你提交的答案,因为我们没有使用变量 z,我认为它不应该被定义,并且在我们实际反映图像的第二个循环中 for (j = 0; j < width; j++, z-- ) 循环,这里 z-- 什么都不做,所以我认为它应该只是,for (j = 0; j < width; j++)。
  • 你是对的,它没有针对未使用的东西进行优化。我又添加了 2 个版本。
【解决方案2】:

您正在重新初始化颜色字节,而我们需要在此处换出像素,我建议首先创建一个交换函数,如下所示:

void swap (RGBTRIPLE *a, RGBTRIPLE *b)
{
    RGBTRIPLE temp = *a;
    *a = *b;
    *b = temp;
}

然后交换像素,因为我们中途交换确保运行 j for width/2

这是供您参考的代码:

void reflect(int height, int width, RGBTRIPLE image[height][width])
{
    for (int i = 0; i < height; i++)
    {
        int k = width - 1;
        for (int j = 0; j < width/2; j++)
        {
            swap(&image[i][j], &image[i][k]);
            k--;
        }
    }
    return;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多