【问题标题】:Why do my conditions (IF statements) return false?为什么我的条件(IF 语句)返回 false?
【发布时间】:2020-10-27 12:53:53
【问题描述】:

我正在尝试解决 CS50x 课程中 PSET4 滤镜(更少)中的模糊功能。这就是问题所在:


模糊

有多种方法可以创建模糊或柔化图像的效果。对于这个问题,我们将使用“框模糊”,它的工作原理是获取每个像素,并且对于每个颜色值,通过平均相邻像素的颜色值给它一个新值。

每个像素的新值将是原始像素 1 行和列内的所有像素值的平均值(形成一个 3x3 框)。例如,像素 6 的每个颜色值将通过平均像素 1、2、3、5、6、7、9、10 和 11 的原始颜色值来获得(请注意,像素 6 本身包含在平均的)。同样,像素 11 的颜色值将通过平均像素 6、7、8、10、11、12、14、15 和 16 的颜色值来获得。

对于沿边缘或角落的像素,例如像素 15,我们仍会查找 1 行和列内的所有像素:在本例中为像素 10、11、12、14、15 和 16。


这是我目前写的代码:

// Blur image
void blur(int height, int width, RGBTRIPLE image[height][width])
{
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            int red = image[i][j].rgbtRed;
            float count = 0.0;
            int blurRed = 0;

            for (int k = 0; (k <= i + 1) && (k < height); k++)
            {
                for (int l = 0; (l <= j + 1) && (l < width); l++)
                {
                    int sumRed = image[k][l].rgbtRed;

                    if ((k - 1 >= 0) && (k + 1 < height))
                    //these if statements should ensure that the following action is only carried out IF the k/l indices do not exceed height and width
                    {
                        sumRed += image[k - 1][l].rgbtRed;
                        count++;
                    }

                    if ((l - 1 >= 0) && (l + 1 < width))
                    {
                        sumRed += image[k][l - 1].rgbtRed;
                        count++;
                    }
                    blurRed = roundf(sumRed / count);
                }
            }          
            red = blurRed;
        }
    }
}

虽然我不确定我的解决方案是否走在正确的轨道上。当我运行代码时,我收到以下错误消息:

helpers.c:139:45:运行时错误:除以零 helpers.c:139:32:运行时错误:inf 超出了“int”类型的可表示值的范围

所以我想知道为什么我的计数器总是保持在 0。

期待一些帮助和答案!

【问题讨论】:

  • 请注意,(k - 1 &gt;= 0) &amp;&amp; (k + 1 &lt; height)(k &gt; 0) &amp;&amp; (k &lt;= height) 的等价物,难以阅读。所以你永远不会输入k == 0,并且k总是小于height,因为for循环条件。

标签: c if-statement cs50 divide-by-zero


【解决方案1】:

在第一次迭代中,当k = 0 时,条件k - 1 &gt;= 0 将评估为假,0 - 1 不是&gt;= 0l 也是如此,结果count 将是@ 987654327@ 并执行除以0

另外,count 应该是一个整数值,最好是无符号的。为避免此更改导致的整数除法舍入问题,您可以稍后将sumRedcount 转换为float

blurRed = roundf((float)sumRed/count);

或者简单地将sumRead 声明为float 而不是int

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    • 2022-10-23
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 2018-06-25
    相关资源
    最近更新 更多