2014-01-15 5 views
1

질문 : How to create a cairo_t on a Gtk 2 window의 조언을 GTK 2.0 응용 프로그램에 구현하려고하는데 그 결과에 당황 스럽습니다. 오류 출력은동일한 유형이 일치하지 않는 이유

planes_view.c: In function ‘draw_lines_planes’: 
planes_view.c:145:33: warning: passing argument 1 of ‘gdk_cairo_create’ from incompatible pointer type [enabled by default] 
    cr = gdk_cairo_create((struct GdkDrawable *)(view->drawing_area)); 
          ^
In file included from /usr/include/gtk-2.0/gdk/gdk.h:33:0, 
       from /usr/include/gtk-2.0/gtk/gtk.h:32, 
       from planes_view.h:35, 
       from planes_view.c:34: 
/usr/include/gtk-2.0/gdk/gdkcairo.h:33:10: note: expected ‘struct GdkDrawable *’ but argument is of type ‘struct GdkDrawable *’ 
cairo_t *gdk_cairo_create   (GdkDrawable  *drawable); 
     ^

입니다. 두 충돌 유형은 동일합니다. 어떻게 이럴 수있어? 아마도 같은 이름의 두 가지 유형일까요? 그렇더라도, 나는이 일을 올바르게하는 방법을 알아야합니다.

기분을 상하게하는 라인은 원래

cr = gdk_cairo_create(view->drawing_area); 

이었다 그리고 불만 도면 영역의 선언 타입이 GtkWidget *는 것을, 그래서 따라서 정상적인 배역을 시도 : 위의 결과

cr = gdk_cairo_create((struct GdkDrawable *)(view->drawing_area)); 

을 .

+0

최소한의 편집 가능한 예로 잘라낼 수 있습니까? (내 직감적 인 본능은 구조체가 호환되지 않는다는 것을 알려주지 만, 여러분이 보게 될 실수는 아니라고 생각합니다.) – tabstop

+0

키워드 "struct"를 삭제하려고 시도합니다. GdkDrawable은 이미 typedef입니다. –

+0

GtkWidget은 GdkDrawable이 아닌 무언가에 캐스팅 할 수 없습니다. 당신이 원하는 GdkDrawable은 아마도'view-> drawing_area-> window' 일 것입니다. 그러나 원래 응답에서했던 것,'widget-> window' (expose 핸들러의 첫 번째 인자가 widget이라고 가정 할 때)를하지 않을까요? ... 사실 이제 나는 그것에 대해 생각한다 :'gtk_widget_get_window (widget)'이 최선의 방법 일 것이다. – jku

답변

0

나는 기호에 대한 호환되지 않는 정의가 있거나이 기호를 여러 번 컴파일한다고 말하고 싶습니다. 기호의 가시성을 확인하십시오.

+0

전혀 도움이되지 않습니다. 구조체는 GTK/cairo 헤더에서옵니다. 내 코드는 그것을 정의하지 않습니다. – 4dummies

+0

게다가, 나는 "가시성 (visibility)"을 확인하는 방법이나 실제로 C에 무엇이 있는지 전혀 모른다. – 4dummies

1

컴파일러를 신뢰하십시오. struct GdkDrawable *GdkDrawable *과 같지 않습니다. GdkDrawable 이미 구조체에 대한 형식 정의입니다 :

typedef struct _GdkDrawable GdkDrawable;

그리고 JKU 말했듯이, 당신은 일을 망치는 것입니다. gdk_cairo_createGdkDrawable을 예상하며 GtkWidget을 피드하려고합니다. GdkDrawable은 (window 회원)에 저장되며 gtk_widget_get_window을 사용하여 액세스 할 수있는 GdkWindow입니다.

관련 문제