2011-06-06 45 views
2

我在探索爲D 語言(http://d-programming-language.org/)創建Clutter綁定的可能性,並開始使用動態加載libclutter進行一些簡單測試的 。我已經運行 成爲一個可能來自GObject繼承 系統的問題,我很感激得到它的任何幫助。這裏是 概要:使用clutter_stage_get_default返回一個ClutterActor *,其中 我可以使用clutter_actor_ *方法。但是,當我使用clutter_stage_ *或clutter_container_ * 方法時,我總是會收到錯誤或 段錯誤。這裏是我的測試代碼:http://pastebin.com/nVrQ69dUCasting ClutterActor *到ClutterStage *

在上線56 clutter_container_add_actor電話,我得到以下錯誤: (<unknown>:11976): Clutter-CRITICAL **: clutter_container_add_actor: assertion 'CLUTTER_IS_CONTAINER (container)' failed

在示例代碼中,我已經注意到了CLUTTER_STAGE和 CLUTTER_CONTAINER宏鑄造(這顯然是不 ),但據我所知,他們只是執行 一些檢查,然後做了一個普通的C演員。如果這是不正確的,並且一些 Gobject類型的魔法需要在 轉換之前在舞臺指針上完成,請告訴我。綁定和使用 clutter_stage_set_title或clutter_stage_set_color與cast(ClutterStage*)stage導致 分段錯誤,大概是同樣的問題。

編輯:這是stripped down example沒有外部依賴(如果你不在Linux上,你需要用你的操作系統的等價物替換dl調用)。此代碼失敗段錯誤,它根據GDB和Valgrind的,是在clutter_stage_set_title (in /usr/lib/libclutter-glx-1.0.so.0.600.14)

回答

2

的問題是,你不爲extern(C)聲明C函數。因爲dmd認爲你在調用D函數並使用了錯誤的調用約定。正確地做到這一點的一種方法是這樣的:

alias extern(C) void function(void*, const char*) setTitleFunc; 
auto clutter_stage_set_title = getSym!(setTitleFunc)("clutter_stage_set_title"); 

我不知道如何使它沒有別名的工作。 DMD拒絕在一個模板參數解析與extern(C)什麼:

auto clutter_stage_set_title = getSym!(extern(C) void function(void*, const char*))("clutter_stage_set_title"); //Doesn't work 

BTW:你cstring功能是危險的:它返回一個char *表示該字符串可以修改,但並非總是如此:如果你通過一個字符串文字到toStringz它可能不會分配新的內存,而是返回原始字符串的指針。字符串文字在只讀內存中,所以這可能會導致問題。

您可以調整您的函數類型以匹配C類型(D中的const gchar*),並直接使用toStringz。

+0

啊,我沒有意識到我需要在動態綁定時指定C調用約定,儘管回想起來它是有意義的。 – 2011-06-07 16:27:45

0

結構在d不能從彼此和鑄造結構的指針繼承將返回空值,除非有一箇中間流延到void*(不同於一個C鑄造)我得到了鑄造

時,但如果你做了什麼發生在這裏駁斥

你最好不要使用手柄包裝結構並模仿那些宏檢查添加另一個抽象層

clutter_container_add_actor(cast(ClutterContainer*)(cast(void*)stage), textbox); 

(鑄造到void *,然後再以ClutterContainer *)

+0

使用您的建議會產生相同的結果。此外,四周施放結構指針不會產生null - 增加'writeln(stage); writeln(cast(ClutterContainer *)stage);'產生兩個相同的內存地址。我使用DMD 2.053,如果這有什麼不同。 – 2011-06-06 20:41:05

+0

@justin你可能只需要爲Clutter句柄使用void指針,這就是我在其他庫中與C風格結構 – 2011-06-06 21:23:05

+0

@justin接口或者嘗試獲取結構的確切結構並將它們重新創建爲D接口文件,並嘗試與那些 – 2011-06-06 21:43:09