#arrays #c #cs50
#массивы #c #cs50
Вопрос:
для CS50 Pset4 фильтрует часть ребер, https://cs50.harvard.edu/x/2020/psets/4/filter/more / У меня есть приведенный ниже код, и он возвращает ошибку
помощники.c: 205:216: ошибка времени выполнения: индекс 601 вне границ для типа ‘RGBTRIPLE [width]’
в строке
RGBTRIPLE array[] = {larger_image[i][j], larger_image[i][j 1], larger_image[i][j 2],
larger_image[i 1][j], larger_image[i 1][j 1], larger_image[i 1][j 2],
larger_image[i 2][j], larger_image[i 2][j 1], larger_image[i 2][j 2]};
Логика моего кода заключается в создании нового изображения larger_image с контурами нулевых значений RGB. Таким образом, можно легко вычислить оператор Собеля.
Затем я создаю еще один массив из 9 элементов с типом RGBTRIPLE, чтобы я мог перебирать, чтобы суммировать итоговый продукт блока. Но здесь появилась ошибка, я проверил границы i и j, и, похоже, все в порядке…
может кто-нибудь помочь мне разобраться, почему здесь ошибка в массиве?
void edges(int height, int width, RGBTRIPLE image[height][width])
{
RGBTRIPLE(*edged)[width] = calloc(height, (width) * sizeof(RGBTRIPLE));
**// create another mirror image with size of height 2 and width 2 of outline RGB numbers zero**
RGBTRIPLE(*larger_image)[width] = calloc(height 2, (width 2) * sizeof(RGBTRIPLE));
int i =0;
int j = 0;
float blue_final, green_final, red_final;
for (i = 1; i < height 1; i )
{
for (j = 1; j < width 1; j )
{
larger_image[i][j] = image[i-1][j-1];
}
}
int gx[] = {-1, 0, 1, -2, 0, 2, -1, 0, 1};
int gy[] = {-1, -2, -1, 0, 0, 0, 1, 2, 1};
for (i = 0; i < height; i )
{
for (j = 0; j < width; j )
{
int blue_x = 0, blue_y = 0, green_x = 0, green_y = 0, red_x = 0, red_y = 0;
**//create an array of 9 elements easier for me to loop the sumproduct with gx/gy below, error here.**
RGBTRIPLE array[] = {larger_image[i][j], larger_image[i][j 1], larger_image[i][j 2],
larger_image[i 1][j], larger_image[i 1][j 1], larger_image[i 1][j 2],
larger_image[i 2][j], larger_image[i 2][j 1], larger_image[i 2][j 2]};
for (int k = 0; k < 9; k )
{
blue_x = array[k].rgbtBlue * gx[k];
blue_y = array[k].rgbtBlue * gy[k];
green_x = array[k].rgbtGreen * gx[k];
green_y = array[k].rgbtGreen * gy[k];
red_x = array[k].rgbtRed * gx[k];
red_y = array[k].rgbtRed * gy[k];
}
blue_final = sqrt(pow(blue_x, 2) pow(blue_y, 2));
if(blue_final > 255.0)
{
blue_final = 255.0;
}
red_final = sqrt(pow(red_x, 2) pow(red_y, 2));
if(red_final > 255.0)
{
red_final = 255.0;
}
green_final = sqrt(pow(green_x, 2) pow(green_y, 2));
if(green_final > 255.0)
{
green_final = 255.0;
}
edged[i][j].rgbtBlue = round(blue_final);
edged[i][j].rgbtGreen = round(green_final);
edged[i][j].rgbtRed = round(red_final);
}
}
for (i = 0; i < height; i )
{
for (j = 0; j < width; j )
{
image[i][j] = edged[i][j];
}
}
return;
}
Комментарии:
1. Где вы освобождаете выделенную память?
2. Не связано с проблемой, но в вашем массиве нет необходимости
edged
. Вы уже скопировали исходное изображение перед выполнением вычислений. Затем вы можете напрямую сохранить результатimage
.3. да, вы правы, мне нужно освободить память и не нужно обрезать .. отличная помощь
Ответ №1:
Вы пытаетесь создать массив, содержащий больше width*hight
элементов:
RGBTRIPLE(*larger_image)[width] = calloc(height 2, (width 2) * sizeof(RGBTRIPLE));
Это распределение может содержать достаточно памяти для этой цели, но оно не соответствует типу вашей переменной.
larger_image
является указателем на массив width
элементов, независимо от того, сколько памяти вы выделяете.
Ваша проверка во время выполнения обнаруживает, что вы обращаетесь к индексу width 1
, и выдает ошибку.
Чтобы заставить его работать, вам нужно использовать
RGBTRIPLE(*larger_image)[width 2] = calloc(height 2, (width 2) * sizeof(RGBTRIPLE));