Программа-фильтр на C не работает на более сложных изображениях

Мне нужно написать программу, которая делает фильтр оттенков серого. Это работает только частично, и у меня есть следующие сообщения об ошибках:

:) grayscale correctly filters single pixel with whole number average
:( grayscale correctly filters single pixel without whole number average
    expected "28 28 28\n", not "27 27 27\n"
:) grayscale leaves alone pixels that are already gray
:) grayscale correctly filters simple 3x3 image
:( grayscale correctly filters more complex 3x3 image
    expected "20 20 20\n50 5...", not "20 20 20\n50 5..."
:( grayscale correctly filters 4x4 image
    expected "20 20 20\n50 5...", not "20 20 20\n50 5..."

Код ниже:

void grayscale(int height, int width, RGBTRIPLE image[height][width])
{
    for(int i = 0; i < height; i++) //Loop thought each row of 2D array
    {
        for(int j = 0; j < width; j++)//Loop through each pixel of each row
        {

            int red = image[i][j].rgbtRed;
            int blue = image[i][j].rgbtBlue;
            int green = image[i][j].rgbtGreen;
            int avr = round((red + blue + green) / 3);
            image[i][j].rgbtBlue = image[i][j].rgbtGreen = image[i][j].rgbtRed = avr;

        }
    }
    return;
}

где вы берете эти ошибки?

Tugay 24.12.2020 00:50

Если программа проверки ожидает 28, а вы получаете 27, то ваше деление и округление могут показаться неправильными. Что получится, если разделить на 3,0? Вероятно, где-то в задании есть примечание, предупреждающее о целочисленном делении.

Retired Ninja 24.12.2020 01:55

@LoadingПоследние два сообщения неясны. Пожалуйста, объясните, как это ошибки.

chux - Reinstate Monica 24.12.2020 02:19

@chux-ReinstateMonica Это результат работы программы check50, которая является частью класса CS50.

Retired Ninja 24.12.2020 02:22

@RetiredNinja OP опубликовал "ожидаемое" 20 20 20\n50 5...", а не "20 20 20\n50 5...". Это также может быть ошибкой транскрипции со стороны OP, поскольку заявленное ожидаемое и фактическое совпадают .

chux - Reinstate Monica 24.12.2020 02:25

@chux-ReinstateMonica Настоящая проблема в таких случаях скрыта за .... Раньше был способ получить полное сообщение, но прошло несколько лет, поэтому программа могла измениться. пожимание плечами

Retired Ninja 24.12.2020 02:31

Спасибо всем за то, что уделили время и помогли мне решить проблему. Я разделил на двойное- 3.0 и все работает нормально. Я получал ошибки от системы, созданной онлайн-курсом, который я провожу, который проверяет результат перед отправкой.

Loading 24.12.2020 10:21
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

round() неэффективен, так как частное двух int равно int. Округление int не влияет.

//                 ........int........  / int
// int avr = round((red + blue + green) / 3);

// Divide by a `double`
int avr = round((red + blue + green) / 3.0);
// or
int avr = lround((red + blue + green) / 3.0);

// or even better, round with integer math.
int avr = ((red + blue + green)*2 + 3)/6;

Могут существовать и другие проблемы, но это объясняет "ожидаемое "28 28 28\n", а не "27 27 27\n".

Другие вопросы по теме