2014-01-15 91 views
1

我試圖在我的GTK 2.0應用程序中實現來自問題How to create a cairo_t on a Gtk 2 window的建議,我對結果感到困惑。錯誤輸出爲相同類型如何不匹配

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'(假設公開處理程序的第一個參數稱爲widget)? ......現在我想到了:'gtk_widget_get_window(widget)'是最好的方法。 – jku

回答

0

我會說你有符號的不兼容定義,或者你以某種方式多次編譯這個符號。檢查符號的可見性。

+0

這完全沒有幫助。該結構來自GTK/cairo標頭。我的代碼沒有定義它。 – 4dummies

+0

此外,除此之外,我不知道如何檢查「可見性」,或確實是在C中是什麼。 – 4dummies

1

相信編譯器。 A struct GdkDrawable *GdkDrawable *不一樣。 GdkDrawable已經是一個typedef到一個結構:

typedef struct _GdkDrawable GdkDrawable;

而作爲JKU說,你弄亂的東西了。 gdk_cairo_create需要一個GdkDrawable,並且您正在嘗試爲其提供一個GtkWidget。您的GdkDrawable是存儲在GtkWidgetwindow成員)中的GdkWindow,您可以使用gtk_widget_get_window進行訪問。