2012-02-26 33 views
2

我认为tolua中存在关于工会的错误。如果你有这样的声明:tolua中的工会类型

struct SDL_WindowEvent { 
    int type; 
    int windowID; 
}; 

union SDL_Event { 
    int type; 
    SDL_WindowEvent window; 
}; 

extern SDL_Event * create(void); 
extern void frobnicate(SDL_Event *); 

那么它应该是好有LUA代码:

event = create() 
frobnicate(event) 
print(event.window.windowId) 
frobnicate(event) 

但第二次调用frobnicate(事件)将失败,出现错误:

argument #1 is 'SDL_WindowEvent'; 'SDL_Event' expected. 

调试器上的一点点戳意味着event.window访问中的tolua_pushusertype会重写我的变量的类型!

这里是我试过到目前为止:从我的声明,tolua将创建下列呼吁声明SDL_WindowEvent类:

tolua_cclass(tolua_S,"SDL_WindowEvent","SDL_WindowEvent","",NULL); 

从而使SDL_Event和SDL_WindowEvent两个不相关的类,而不是基类的彼此。比方说,我有一些代码后来等同于以下内容:

tolua_pushusertype(tolua_S, event, "SDL_Event"); 
assert(tolua_isusertype(tolua_S,1,"SDL_Event",0,&tolua_err)); 
tolua_pushusertype(tolua_S, event->window, "SDL_WindowEvent"); 
assert(tolua_isusertype(tolua_S,2,"SDL_Event",0,&tolua_err)); 

然后在第四行断言会失败,因为堆栈上的价值具有神奇变化的类型,因为两行的断言。这是因为tolua_pushusertype()更改它 - foo和foo.window具有相同的地址,并且在内部,tolua仅跟踪每个地址的一种类型。如果对象是基类型SDL_Event,则tolua_isusertype()会被满足,但这需要上面的tolua_cclass声明具有“SDL_Event”作为其第四个参数。当我手动解决这个问题时,两个断言都会通过,但我无法每次都手动更改 - 我想要修复tolua来做到这一点,但我并没有明白这一点,但我不清楚。我甚至不知道这是否是正确的做法。

我使用tolua 5.1.4,但tolua ++ 1.92.3发生同样的问题。

有什么我做错了,首先?有没有一种方法可以重写我的声明,使其与tolua保持一致?或者,如果失败了,我可以向tolua申请这个解决方案吗?

回答

1

我想通了!解决方法是编辑我的.pkg文件,如下所示:

struct SDL_WindowEvent : SDL_Event { 
    int type; 
    int windowID; 
}; 

这使得tolua的类层次结构显式化。看起来,我太专注于.pkg内容是有效的C代码。

+0

如果您找到了解决方案,请将问题标记为已解决。 – 2012-02-27 19:19:01

+0

SO让我等了两天才允许我接受自己的答案。 – Enno 2012-02-28 04:15:35