gpt4 book ai didi

c - tolua 中的 union 类型

转载 作者:太空宇宙 更新时间:2023-11-03 23:55:12 25 4
gpt4 key购买 nike

我认为 tolua 中存在关于 union 的错误。如果您有这样的声明:

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(event) 会失败并报错:

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 应用一个修复程序来使这项工作正常进行吗?

最佳答案

我想通了!解决方案是像这样编辑我的 .pkg 文件:

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

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

关于c - tolua 中的 union 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9450228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com