Мне нужно написать программу, которая делает фильтр оттенков серого. Это работает только частично, и у меня есть следующие сообщения об ошибках:
:) 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;
}
Если программа проверки ожидает 28, а вы получаете 27, то ваше деление и округление могут показаться неправильными. Что получится, если разделить на 3,0? Вероятно, где-то в задании есть примечание, предупреждающее о целочисленном делении.
@LoadingПоследние два сообщения неясны. Пожалуйста, объясните, как это ошибки.
@chux-ReinstateMonica Это результат работы программы check50
, которая является частью класса CS50.
@RetiredNinja OP опубликовал "ожидаемое" 20 20 20\n50 5...", а не "20 20 20\n50 5...". Это также может быть ошибкой транскрипции со стороны OP, поскольку заявленное ожидаемое и фактическое совпадают .
@chux-ReinstateMonica Настоящая проблема в таких случаях скрыта за ...
. Раньше был способ получить полное сообщение, но прошло несколько лет, поэтому программа могла измениться. пожимание плечами
Спасибо всем за то, что уделили время и помогли мне решить проблему. Я разделил на двойное- 3.0 и все работает нормально. Я получал ошибки от системы, созданной онлайн-курсом, который я провожу, который проверяет результат перед отправкой.
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".
где вы берете эти ошибки?