我认为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申请这个解决方案吗?
如果您找到了解决方案,请将问题标记为已解决。 – 2012-02-27 19:19:01
SO让我等了两天才允许我接受自己的答案。 – Enno 2012-02-28 04:15:35