2011-03-16 1 views
0

나는 파일 설명 출력에 PDF를해야하고, 나는 카이로와 cairo_pdf_surface_create_for_stream()를 사용하는 생각을했다 :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); 

하지만 컴파일러 경고를 받고 있어요 : 내가 wfunc = &cairowrite;를 수행 라인에 warning: assignment from incompatible pointer type

나는이 시도.

내가 뭘 잘못하고 있니?

콜백 함수는이 gcc 오류 : cairo_status_t을 제공하지만 cairo_write_func_t이어야합니다.

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. 

어떻게해야합니까 : 그 소리와

나는이 오류가?

답변

0

문제가 해결!

나는 함수 정의가 :

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는 오류를주지 않습니다.

0

당신은

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 
+0

Erm, 예를 들어, C++에서 함수 포인터를 일반적으로 사용하는 방법을 간단히 설명합니다. 그건 제 질문이 아니 었습니다. 함수가 동시에 두 가지 유형을 가질 수있는 방법을 알아야합니다. 그리고 libcairo 관련 예제도 좋을 것입니다. – polemon

+0

방금 ​​제안을 확인했지만 작동하지 않습니다. – polemon

+0

예, 당신 말이 맞아요. 나는 처음에'cairo_write_func_t' 유형에주의를 잃었고 위의 예제를 제공했습니다. 그런 다음 부적절하다는 것을 깨달았습니다. 그러나 나는 함수 포인터의 "확장 된"정의가 효과가있을 것이라고 생각했다. 미안해. –

관련 문제