Как создать правильный обратный вызов для cairo_pdf_surface_create_for_stream()?

Мне нужно вывести PDF в дескриптор файла, и я думал об использовании Cairo и cairo_pdf_surface_create_for_stream():

У меня есть функция записи, которая имеет эту подпись:

static cairo_status_t cairowrite(void *fp, unsigned char const *data, unsigned int length);

Он возвращает CAIRO_STATUS_SUCCESS.

Теперь, как мне передать эту функцию в качестве обратного вызова?

Я пробовал это:

cairo_write_func_t (*wfunc)(void *, unsigned char const *, unsigned int);
wfunc = (cairo_write_func_t)&cairowrite;
surface = cairo_pdf_surface_create_for_stream((cairo_write_func_t)wfunc, fp, (double)realwidth, (double)realwidth);

Но я получаю предупреждения компилятора: warning: assignment from incompatible pointer type Которое находится в строке, где я делаю wfunc = &cairowrite;.

Что я делаю не так?

Функция обратного вызова выдает эту ошибку gcc: cairo_status_t, но должна иметь тип cairo_write_func_t.

С clang я получаю эту ошибку:

qrencode.c:250:11: warning: incompatible pointer types assigning to 'cairo_write_func_t (*)(void *, unsigned char const *, unsigned int)' from
      'cairo_write_func_t' (aka 'cairo_status_t (*)(void *, unsigned char const *, unsigned int)')
    wfunc = (cairo_write_func_t)&cairowrite;
          ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 warning generated.

Что я должен делать?


person polemon    schedule 16.03.2011    source источник


Ответы (2)


Вы можете попытаться определить указатель функции с помощью

cairo_status_t (*wfunc)(FILE *, unsigned char *, unsigned int) = &cairowrite;

Пример:

#include <iostream>

int funp(int a, int b) {
  return a + b;
}

int call(int a, int b, int (*ptr)(int, int)) {
  int result = ptr(a, b);
  return result;
}

int main() {
  int (*ptr)(int, int) = &funp;
  int r = call(3, 5, ptr);
  std::cout << "Result " << r << std::endl;
  return 0;
}

Выход:

Result 8
person Vincenzo Pii    schedule 16.03.2011
comment
Эээ, ваш пример просто описывает общее использование указателей функций в C++, это был не мой вопрос. Мне нужно знать, как функция может иметь два типа одновременно. И пример, связанный с libcairo, тоже был бы хорош. - person polemon; 16.03.2011
comment
Да, ты прав :). Я сначала отвлекся на тип cairo_write_func_t и привел пример выше, потом понял, что это неуместно. Однако я думал, что расширенное определение указателя функции сработает. Жаль, что этого не произошло. - person Vincenzo Pii; 16.03.2011

Проблема решена!

У меня есть определение функции:

static cairo_status_t cairowrite(void *fh, unsigned char const *data, unsigned int length);

И вот как я передаю обратный вызов:

surface = cairo_pdf_surface_create_for_stream((cairo_write_func_t)cairowrite, fp, (double)realwidth, (double)realwidth);

Я больше не использую указатель промежуточной функции. clang и gcc не дают никаких ошибок.

person polemon    schedule 16.03.2011