我正在试着解决CS50 Week 4 Pset中的反射滤镜,但我被卡住了.我的逻辑是使用RGBTRIPLE类型的缓冲区在整个图像中将最后一个像素从image[n][width - 1]复制到第一个像素image[n][n].但是,我的代码似乎有问题:

void reflect(int height, int width, RGBTRIPLE image[height][width])
{
    for (int h = 0; h < height; h++)
    {
        RGBTRIPLE buffer;
        for (int w = 0; w < width; w++)
        {
            buffer = image[h][w];
            image[h][w] = image[h][width - w];
            image[h][width - w] = buffer;
        }
    }
    return;
}

推荐答案

您的代码至少是不正确的,因为当h等于height - 1,w等于0时,表达式image[h][width - w]可以访问图像以外的内存,因为数组一行的有效索引范围是[0, width).

但是,即使您将使用表达式image[h][width - w - 1],循环

for (int w = 0; w < width; w++)

将形成相同的原始行.

如果您想要反转图像的每一行,则该函数可以如下所示

void reflect( size_t height, size_t width, RGBTRIPLE image[height][width] )
{
    for ( size_t h = 0; h < height; h++ )
    {
        for ( size_t w = 0; w < width / 2; w++ )
        {
            RGBTRIPLE buffer;
            buffer = image[h][w];
            image[h][w] = image[h][width - w - 1];
            image[h][width - w - 1] = buffer;
        }
    }
}

C++相关问答推荐

%p与char* 等组合缺少的GCC Wform警告

sizeof结果是否依赖于字符串的声明?

从内联程序集调用Rust函数和调用约定

将整数的.csv文件解析为C语言中的二维数组

双指针指向常量双指针的指针类型赋值不兼容

`#if`条件中是否允许`sizeof`?

为什么我可以在GCC的标签后声明变量,但不能声明Clang?

如何计算打印二叉搜索树时每行所需的空间?

一旦运行长度超过2,编译器是否会优化";strnlen(mystring,32)>;2";以停止循环?

如何使用C++在控制台中以彩色打印被阻止的客户端

Printf()在C中打印终止字符之后的字符,我该如何解决这个问题?

为什么我在C代码中得到一个不完整的类型?

将 struct 数组写入二进制文件时发生Valgrind错误

某些EAX值的不同调用方的CPUID结果不一致

Tcl_GetDoubleFromObj在列表的迭代中是一个缺点

在我的第一个C语言中观察到的错误';你好世界';程序

令人困惑的返回和 scanf 问题相关

execve 不给出which命令的输出

添加/删除链表中的第一个元素

为什么实现文件中的自由函数默认没有内部链接?