C /libpng — fclose() «запускает точку останова» после вызова png_write_png()

#c #libpng

#c #libpng

Вопрос:

Я переделал функцию, которую нашел в учебном пособии для целей тестирования, где я просто заполняю холст размером 512 на 512 пикселями разных цветов и сохраняю это в файл. Затем появляется заголовок. Должен ли я прокомментировать вызов png_write_png() out , никаких точек останова не осталось в поле зрения.

 int save_test_png()
{
    const string path = "D:\test.png";
    const size_t X = 512, Y = 512;
    const size_t PIXEL_SIZE = 4;
    const size_t BIT_DEPTH = 8;

    FILE* image_file_ptr;
    png_structp png_ptr = nullptr;
    png_infop info_ptr = nullptr;
    png_byte** row_pointers = nullptr;

    int status = 0;

    if (fopen_s(amp;image_file_ptr, path.c_str(), "wb"))
    {
        return -1;
    }

    png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
    if (!png_ptr)
    {
        if (image_file_ptr)
        {
            fclose(image_file_ptr);
        }
        return -2;
    }

    info_ptr = png_create_info_struct(png_ptr);
    if (!info_ptr)
    {
        png_destroy_write_struct(amp;png_ptr, amp;info_ptr);
        if (image_file_ptr)
        {
            fclose(image_file_ptr);
        }
        return -3;
    }

    if (setjmp(png_jmpbuf(png_ptr)))
    {
        png_destroy_write_struct(amp;png_ptr, amp;info_ptr);
        if (image_file_ptr)
        {
            fclose(image_file_ptr);
        }
        return -4;
    }

    png_set_IHDR(png_ptr,
        info_ptr,
        X, Y,
        BIT_DEPTH,
        PNG_COLOR_TYPE_RGBA,
        PNG_INTERLACE_NONE,
        PNG_COMPRESSION_TYPE_DEFAULT,
        PNG_FILTER_TYPE_DEFAULT);

    row_pointers = static_cast<png_byte**>(png_malloc(png_ptr, Y * sizeof(png_byte*)));
    for (size_t y = 0; y < Y; y  )
    {
        png_byte* row = static_cast<png_byte*>(png_malloc(png_ptr, sizeof(png_byte) * X * PIXEL_SIZE));
        row_pointers[y] = row;
        for (size_t x = 0; x < X; x  )
        {
            *row   = (x amp; 0x3F) << 2;                           // red
            *row   = ((x amp; 0x1C0) >> 1) | ((y amp; 0x1C0) >> 4);   // green
            *row   = (y amp; 0x3F) << 2;                           // blue
            *row   = 0xFF;                                      // alpha
        }
    }

    png_init_io(png_ptr, image_file_ptr);
    png_set_rows(png_ptr, info_ptr, row_pointers);
    png_write_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);

    status = 0;

    for (size_t y = 0; y < Y; y  )
    {
        png_free(png_ptr, row_pointers[y]);
    }
    png_free(png_ptr, row_pointers);
    png_destroy_write_struct(amp;png_ptr, amp;info_ptr);
    fclose(image_file_ptr);

    return status;
}
 

Я создал libpng и zlib из исходного кода, используя решения Visual Studio, поставляемые с официальными выпусками. В настоящее время проект настроен как Debug x64, файлы .lib и .dll для libpng и zlib были встроены в конфигурацию выпуска x64, как предложено в руководстве. «AppName.exe сработала точка останова» также исчезает, если я перенастрою проект, над которым работаю, на версию x64.

Ответ №1:

Исключение «запуск точки останова» исчезло, когда я связал свою конфигурацию Debug x64 с .файлы библиотеки, созданные в конфигурации Debug x64, а также помещенный DLL-файл, созданный в той же конфигурации, в папку x64 / Debug проекта, где находится исполняемый файл.