CS50 更多滤镜(模糊)调试帮助,我完全卡住了

问题描述 投票:0回答:1

所以我自己制作了所有其他项目,只向 Chatgpt 寻求帮助,因为我问出了什么问题(并且没有解决),他向我暗示了问题,我在询问和学习 C 语言的同时修复了它。但现在,我们都陷入了困境…… 它可以工作,但是 CS50 测试人员没有得到他预期的结果,所以它不是...... 一些数学知识或者我不知道我缺少什么......

:( 模糊正确过滤了中间像素 预计“127 140 149 ”,而不是“123 135 143 ” :( 模糊正确过滤边缘上的像素 预计“80 95 105 ”,而不是“75 88 97 ” :( 模糊正确地过滤了角落里的像素 预计“70 85 95 ”,而不是“56 68 76 ”

void blur(int height, int width, RGBTRIPLE image[height][width])
{
    for (int i = 0; i< height; i++)
    {
        for (int j = 0; j< width; j++)
        {
            double sumRed = 0, sumGreen = 0, sumBlue = 0;
            int dec = 0;
            int fakeRow = i;
            int cycle = 1;
            double calcAv = 1;


            if (i > 0)
            {
                cycle += 1;
                dec = 1;
            }
            if (i < height - 1)
            {
                cycle += 1;
            }

            do
            {
                if (cycle == 1 && fakeRow < height - 1)
                {
                    fakeRow += 1;
                }
                calcAv += 1;
                sumRed += image[fakeRow - dec][j] .rgbtRed;
                sumGreen += image[fakeRow - dec][j].rgbtGreen;
                sumBlue += image[fakeRow - dec][j].rgbtBlue;

                if (j > 0)
                {
                    sumRed += image[fakeRow - dec][j - 1].rgbtRed;
                    sumGreen += image[fakeRow - dec][j - 1].rgbtGreen;
                    sumBlue += image[fakeRow - dec][j - 1].rgbtBlue;
                    calcAv += 1;
                }
                if (j < width - 1)
                {
                    sumRed += image[fakeRow - dec][j + 1].rgbtRed;
                    sumGreen += image[fakeRow - dec][j + 1].rgbtGreen;
                    sumBlue += image[fakeRow - dec][j + 1].rgbtBlue;
                    calcAv += 1;
                }
                dec = 0;
                cycle -= 1;
            }
            while (cycle != 0);
            BYTE averageR = (BYTE)round(sumRed / calcAv);
            BYTE averageG = (BYTE)round(sumGreen / calcAv);
            BYTE averageB = (BYTE)round(sumBlue / calcAv);

            // Update the image with the new color values
            image[i][j].rgbtRed = averageR;
            image[i][j].rgbtGreen = averageG;
            image[i][j].rgbtBlue = averageB;
        }
    }
    return;
}
c debugging math cs50
1个回答
0
投票

当你“完全陷入困境”时,休息一下,去散步。 (像爱因斯坦一样,去航行或拉一会儿小提琴。)对如何前进视而不见是非常人性化的。让你的潜意识有机会成为你最好的朋友。 正如 @RetiredNinja 所报告的,您需要

two

缓冲区来完成此任务。矩阵的每个元素既用作值的源,又用作任务完成之前存储结果的目的地。 对你的方法感到困扰(使用

fakeRow

)我将你的代码提炼为以下内容,结果报告如下:

void blur( int height, int width ) {
    for (int i = 0; i< height; i++) {
        for (int j = 0; j< width; j++) {
            int dec = 0;
            int fakeRow = i;
            int cycle = 1;
            double calcAv = 1;

            if (i > 0) {
                cycle += 1;
                dec = 1;
            }
            if (i < height - 1)
                cycle += 1;

            do {
                if (cycle == 1 && fakeRow < height - 1)
                    fakeRow += 1;

                calcAv += 1;
                printf( "(%d,%d) ", fakeRow - dec, j );

                if (j > 0) {
                    printf( "(%d,%d) ", fakeRow - dec, j-1 );
                    calcAv += 1;
                }
                if (j < width - 1)
                {
                    printf( "(%d,%d) ", fakeRow - dec, j+1 );
                    calcAv += 1;
                }
                dec = 0;
                cycle -= 1;
            } while (cycle != 0);

            printf( " ... CalcAv %f\n", calcAv );
        }
    }
}

int main( void ) {
    blur( 3, 3 );

    return 0;
}

结果:

(0,0) (0,1) (1,0) (1,1) ... CalcAv 5.000000 (0,1) (0,0) (0,2) (1,1) (1,0) (1,2) ... CalcAv 7.000000 (0,2) (0,1) (1,2) (1,1) ... CalcAv 5.000000 (0,0) (0,1) (1,0) (1,1) (2,0) (2,1) ... CalcAv 7.000000 (0,1) (0,0) (0,2) (1,1) (1,0) (1,2) (2,1) (2,0) (2,2) ... CalcAv 10.000000 (0,2) (0,1) (1,2) (1,1) (2,2) (2,1) ... CalcAv 7.000000 (1,0) (1,1) (2,0) (2,1) ... CalcAv 5.000000 (1,1) (1,0) (1,2) (2,1) (2,0) (2,2) ... CalcAv 7.000000 (1,2) (1,1) (2,2) (2,1) ... CalcAv 5.000000

使用
非常规

fakeRow,您的代码正确地形成了适当的矩阵索引(令我惊讶!)。然而,元素的

CalcAv
计数器是
差一
。 (一个常见的错误和一个简单的修复留给您执行。) ChatGPT 经常会被哄骗提供正确的代码,但法学硕士并不“理解”你的问题(就像你在职业生涯中会遇到的许多老板和同事一样。)这取决于你磨练你寻找替代方案的技能方法,以便充分理解您遇到的障碍是什么以及为什么。最美好的祝愿!

© www.soinside.com 2019 - 2024. All rights reserved.