Проблема с функцией округления в оттенках серого Cs50 pset4

#c #filter #rounding #cs50 #grayscale

#c #Фильтр #округление #cs50 #оттенки серого

Вопрос:

Я работаю над фильтром cs50 pset4 (менее удобным) в оттенках серого, и мне приходится округлять числа, если они десятичные. Но по какой-то причине check50 выводит это:

 :( grayscale correctly filters single pixel without whole number average
    expected "28 28 28n", not "27 27 27n"

:( grayscale correctly filters more complex 3x3 image
    expected "20 20 20n50 5...", not "20 20 20n50 5..."

:( grayscale correctly filters 4x4 image
    expected "20 20 20n50 5...", not "20 20 20n50 5..."
  

Это просто грустные лица. Это мой код:

 void grayscale(int height, int width, RGBTRIPLE image[height][width])
{
    for(int j = 0; j < width; j  )
        for(int i = 0; i < height; i   ) {
            double av = (image[i][j].rgbtGreen   image[i][j].rgbtRed   image[i][j].rgbtBlue)/3;
            int average = round(av);
            image[i][j].rgbtGreen = average;
            image[i][j].rgbtRed = average;
            image[i][j].rgbtBlue = average;
        }
}
  

Функция округления находится здесь:

  int average = round(av);
  

Но, согласно check50, это не работает. Пожалуйста, помогите мне разобраться. Единственное подозрение, которое у меня есть, это то, что я новичок в c, поэтому у меня может быть проблема в моей функции. Я пытался погуглить это, но ничего не имеет смысла. У меня есть

  #include<math.h>
  

часть в моем коде, прямо над частью, которую я вам показываю.

Спасибо, запутался в коде 🙂

Ответ №1:

Кажется, что результат разделения

 (image[i][j].rgbtGreen   image[i][j].rgbtRed   image[i][j].rgbtBlue)/3
  

усекается, поскольку все члены являются целыми числами.

Попробуйте

 (image[i][j].rgbtGreen   image[i][j].rgbtRed   image[i][j].rgbtBlue)/3.0
  

(Используйте 3.0 вместо 3

Ответ №2:

Вместо использования двойного типа данных используйте float

 float av = (image[i][j].rgbtGreen   image[i][j].rgbtRed   image[i][j].rgbtBlue)/3.0

  

И используйте 3.0, потому что в некоторых случаях ваше значение может быть целым числом, поэтому оно не будет округляться до ближайшего целого числа