Динамическое выделение памяти через callback-функцию - C (СИ)

Узнай цену своей работы

Формулировка задачи:

всем привет. в общем задача такая. в libjpeg есть возможность через callback функцию выделять память под изображение, если ее не хватает.
/* what to do when the buffer is full; this should almost never
 * happen since we allocated our buffer to be big to start with
 */
boolean empty_buffer(jpeg_compress_struct* cinfo) {
    // для конвертации в jpg нужна еще память
    size_t buf_new_size = buf_size+102400; // как получить buf_size и указатель на начало буфера
 
    buf_start = (JOCTET *) realloc (buf_start, buf_new_size);
    
        cinfo->dest->next_output_byte = (buf_start+buf_size) - cinfo->dest->free_in_buffer;
    cinfo->dest->free_in_buffer = cinfo->dest->free_in_buffer + (buf_new_size-buf_size);
 
    return true;
}
а вот вызов, из другой функции
/*
...
*/
 
size_t out_buffer_size = 256000; // стартовый буфер для jpeg
 
(JOCTET*) out_buffer  = (JOCTET*) malloc(out_buffer_size);
if(!out_buffer) return NULL;
 
dmgr.init_destination    = init_buffer;
dmgr.empty_output_buffer = empty_buffer;
dmgr.term_destination    = term_buffer;
dmgr.next_output_byte    = out_buffer;
dmgr.free_in_buffer      = out_buffer_size;
 
/*
...
*/
так вот, получается что в функции empty_buffer у нас доступен только указатель на след. байт в который будет идти запись cinfo->dest->next_output_byte ну и сколько сейчас осталось в буфере свободного места (а его не осталось). как в этой функции получить указатель на начало буфера и размер, если не подходит вариант с глобал переменной (т.к. возможен запуск в потоках). что посоветуете? вот что в документации http://www.opensource.apple.com/sour...eg/libjpeg.doc
The manager is expected to remember the buffer's starting address and total size in private fields not visible to the library.
но блин, что это за "private fields"?
можно записать в конец адрес начала и размер, а free_in_buffer намеренно поставить меньше, но зачем надо было так усложнять жизнь программисту, если изначально можно было в jpeg_compress_struct предусмотреть эти поля?

Решение задачи: «Динамическое выделение памяти через callback-функцию»

textual
Листинг программы
    struct mem_destination_mgr dest = (struct mem_destination_mgr*) cinfo->dest;
    dest->pub.next_output_byte = dest->buf;
    dest->pub.free_in_buffer = dest->bufsize;

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.75 из 5
Похожие ответы