CS50 Pset4 Filter-less Reflect函数输出图像无镜像效果问题求助
CS50 Pset4 Reflect 功能失效问题修复
你的代码存在3个核心逻辑错误,直接导致镜像效果不生效:
- 执行顺序倒置:你先执行了从临时数组
tmpi写回原图像的逻辑,之后才把原图像内容拷贝到tmpi。此时tmpi是未初始化的栈内存,存的是随机垃圾值;且你写完回逻辑之后才拷贝原图,相当于整个镜像计算步骤完全没用到原始像素数据。 - 镜像循环从未执行:你给内层循环设置的初始值是
j=0、z=width,循环判断条件是j > z,0从逻辑上永远不可能大于width,这个循环从启动到结束一次迭代都不会跑,原图像自然不会被修改。 - 下标越界+映射逻辑错误:C语言数组下标从0开始,长度为width的数组最大合法下标是
width-1,你把z初始值设为width本身就会触发越界访问;且水平镜像的映射规则是同一行内,原位置j的像素对应镜像后width-1-j的位置,你写的赋值方向完全相反。
按照你原本想用临时数组存储原图的实现思路,正确实现步骤如下:
- 优先完成原图到临时数组的全量拷贝,保证后续处理能拿到完整的原始像素值
- 逐行遍历图像,对每一行的每个列位置,从临时数组中取出镜像对应位置的像素,写回原图像数组
- 额外说明:
RGBTRIPLE是结构体类型,支持直接赋值,不需要单独拷贝三个颜色通道的成员,代码可以更简洁。
修正后的可运行代码:
void reflect(int height, int width, RGBTRIPLE image[height][width]) { RGBTRIPLE tmpi[height][width]; // 先拷贝原始图像到临时数组 for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { tmpi[i][j] = image[i][j]; } } // 逐行完成水平镜像映射 for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { image[i][j] = tmpi[i][width - 1 - j]; } } return; }
内容的提问来源于stack exchange,提问作者jay shah
相关产品推荐
相关产品推荐

