Вы получаете доступ за пределы своего image
2D-массива.
Это происходит в нескольких точках.
Рассмотрим ваши циклы:
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
}
}
i
и j
- это индексы, которые могут варьироваться соответственно от 0 и height
и от 0 до width
.
Но для обоих этих циклов вы получаете доступ за пределами этого лимита. Например, если j = width-1
:
if ( j + 1 < width - 1 && j + 1 > 0)
{
div++;
}
else
{
image[i][j + 1].rgbtRed = 0;
image[i][j + 1].rgbtRed = 0;
image[i][j + 1].rgbtRed = 0;
}
Первое условие не будет истинным как width-1+1 > width -1
, поэтому вы окажетесь в разделе else
, в котором вы получите доступ к
image[i][width].rgbtRed = 0;
что за пределами поля!
И то же самое происходит всякий раз, когда i = height-1
: строки, такие как image[i + 1][j]
, будут обращаться к
image[height][j].rgbtRed = 0;
, который также находится за пределами.
Доступ к массивам за пределами границ приводит к неопределенное поведение , и это то, что обнаруживает ваше дезинфицирующее средство.
Примечание : хотя это не связано с запрошенной ошибкой, вы также можете исправить ошибку в
image[i][j + 1].rgbtRed = 0;
image[i][j + 1].rgbtRed = 0;
image[i][j + 1].rgbtRed = 0;
и в аналогичных частях во всей функции. Учтите, что действует только уровень Красный (трижды!); Я полагаю, что вы намеревались затронуть также зеленый и синий , вместо этого.
Как действовать
Реализация всей функции для вас выходит за рамки этого вопроса, но я попытаюсь предложить, как действовать.
Для каждого пикселя вы в настоящее время
- Подсчитайте элементы, которые не находятся на краю изображения (
div++
) - Установите в 0 элементы, которые не должны вносить вклад в среднее значение (на самом деле за пределами и вызвало ваше неопределенное поведение)
- Суммируйте все значения элементов, окружающих пиксель (включая те, которые вы установили на 0), и разделите на div
Но что заставляет вас суммировать все элементы? Просто суммируйте те, которые действительно полезны! У вас уже есть правильное место для вычисления этой суммы: это место, в котором вы увеличиваете div
.
Примерно так:
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
int div = 1;
int curRedSum = 0, curGReenSum = 0, curBlueSum = 0;
if ( j + 1 < width - 1 && j + 1 > 0)
{
div++;
curRedSum += image[i][j + 1].rgbtRed;
curGreenSum += image[i][j + 1].rgbtGreen;
curBlueSum += image[i][j + 1].rgbtBlue;
}
if ( i + 1 < height - 1 && i + 1 > 0)
{
div++;
curRedSum += image[i+1][j].rgbtRed;
curGreenSum += image[i+1][j].rgbtGreen;
curBlueSum += image[i+1][j].rgbtBlue;
}
/* ... */
float averageR = (float)(curRedSum / ( float )div );
float averageG = (float)(curGreenSum / ( float )div );
float averageB = (float)(curBlueSum / ( float )div );
image[i][j].rgbtRed = round(averageR); // Shouldn't this assignemnt be performed on a copy of the image?
image[i][j].rgbtGreen = round(averageG); // Shouldn't this assignemnt be performed on a copy of the image?
image[i][j].rgbtBlue = round(averageB); // Shouldn't this assignemnt be performed on a copy of the image?
}
}
Отказ от ответственности: это предположение должно быть просто подсказкой. Я не гарантирую, что это будет компилироваться и работать без каких-либо дополнительных настроек.