将| ClutterActor *转换为ClutterStage *

|| 我正在探索为D创建杂波绑定的可能性 语言(http://d-programming-language.org/)并以 使用libclutter的动态加载尝试一些简单的测试。我跑了 可能源自GObject继承的问题 系统,感谢您对解决该问题的任何帮助。这是 调试:使用clutter_stage_get_default返回一个ClutterActor * 我可以使用clutter_actor_ *方法。但是我总是会出错或 我使用clutter_stage_ *或clutter_container_ *时发生段故障 方法。这是我的测试代码:http://pastebin.com/nVrQ69dU 在第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
导致 分割错误,大概是同样的问题。 编辑:这是一个没有外部依赖关系的精简示例(如果您不在Linux上,则需要用OS的等效项替换dl调用)。根据GDB和Valgrind的说法,此代码会因段错误而失败,该错误在ѭ2中     
已邀请:
        问题是您没有将C函数声明为
extern(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
顺便说一句:您的
cstring
函数很危险:它返回一个char *表示可以修改字符串,但这并不总是正确的:如果将字符串文字传递给
toStringz
,它可能不会分配新的内存,而是返回原始字符串的指针代替。字符串文字位于只读存储器中,因此可能导致问题。 您可以只调整函数类型以匹配C类型(C中为--9ѭ--D中为)10ѭ)并直接使用toStringz。     
        D中的结构不能互相继承,并且强制转换结构指针将返回null,除非存在中间转换为
void*
(与C强制转换不同),我在这里对此予以驳斥 您最好使用句柄包装结构添加另一个抽象层,并在投射时从这些宏中模拟检查 但是如果你这样做
clutter_container_add_actor(cast(ClutterContainer*)(cast(void*)stage), textbox);
(先投射到void *,然后投射到ClutterContainer *)     

要回复问题请先登录注册