CS50第4周作业:反射滤镜实现遇阻,求代码排查
CS50 反射滤镜问题修正
你的代码存在两个关键问题,导致无法正确实现图像翻转:
内层循环范围错误
当w遍历整个width时,每个对称位置的像素会被交换两次——前半段完成交换后,后半段又把它们换了回去,最终图像和原图完全一致。正确的做法是只遍历每行的前半部分,即w < width / 2,确保每个对称像素对只交换一次。索引计算错误
width - w会超出数组的有效索引范围(数组最大索引为width-1),比如w=0时,width - w = width,这是无效的数组下标。应该用width - 1 - w来定位当前像素的对称位置。
修正后的代码如下:
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 / 2; w++) { buffer = image[h][w]; // 获取当前像素的对称位置索引 image[h][w] = image[h][width - 1 - w]; image[h][width - 1 - w] = buffer; } } return; }
举个简单示例:假设一行有4个像素(索引0、1、2、3),循环执行时:
w=0,交换索引0和3的像素w=1,交换索引1和2的像素
循环结束后,整行像素完成正确翻转,不会出现重复交换的问题。
内容的提问来源于stack exchange,提问作者miromar
相关产品推荐
相关产品推荐

