You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CS50 pset4 Sepia Filter代码边界异常且check50检测报错

CS50 Pset4 Sepia 滤镜Check50与本地运行结果不一致问题修复

问题根源

  • RGBTRIPLE结构体的三个颜色分量成员类型为uint8_t,即8位无符号整数,取值范围严格限定为0-255。
  • 现有代码的执行顺序存在逻辑缺陷:直接将计算得到的sepia分量值赋值给图像像素成员时,若计算值超过255,uint8_t类型会自动对数值做模256截断,数值会立刻落入0-255区间。
  • 代码在赋值完成后才判断分量值是否超过255,这类判断分支永远不会触发——截断后的数值不可能大于255。
  • 本地VS Code运行未触发问题,是因为测试样本未覆盖计算后sepia分量超过255的高亮度像素场景;check50的测试用例包含这类边界场景,最终返回检测不通过。

修复方案

调整逻辑执行顺序,将阈值校验放在赋值操作之前:

  1. 计算得到的sepia分量值先存储在独立的临时变量中,不要直接写入图像像素。
  2. 对临时变量做阈值夹紧,超过255的数值统一设为255。
  3. 将校验完成的数值赋值给对应的图像像素分量。

修正后的参考代码:

void sepia(int height, int width, RGBTRIPLE image[height][width])
{
    for(int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            float orig_r = image[i][j].rgbtRed;
            float orig_g = image[i][j].rgbtGreen;
            float orig_b = image[i][j].rgbtBlue;

            // 计算值存入临时变量
            int cal_r = round(0.393*orig_r + 0.769*orig_g + 0.189*orig_b);
            int cal_g = round(0.349*orig_r + 0.686*orig_g + 0.168*orig_b);
            int cal_b = round(0.272*orig_r + 0.534*orig_g + 0.131*orig_b);

            // 先夹紧阈值再赋值
            image[i][j].rgbtRed = cal_r > 255 ? 255 : cal_r;
            image[i][j].rgbtGreen = cal_g > 255 ? 255 : cal_g;
            image[i][j].rgbtBlue = cal_b > 255 ? 255 : cal_b;
        }
    }
    return;
}

补充注意事项

  • 确保代码顶部引入math.h头文件,否则部分编译环境下round()函数会返回异常值,也会触发check50报错。
  • 无需针对低于0的数值做校验:sepia计算公式的所有系数均为正,结合原始像素的非负属性,计算结果不可能小于0。

内容的提问来源于stack exchange,提问作者Sadiya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 18:36:08