CS50 Кодирование границ Pset4 — ошибка индекса 601 выходит за рамки для типа ‘RGBTRIPLE [ширина]’

#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));