tolua中的联合类型
2012-2-26 3:18:42
收藏:0
阅读:87
评论:1
我认为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(event)将导致错误:
argument #1 is 'SDL_WindowEvent'; 'SDL_Event' expected.
通过调试器对此进行了一些探索,发现事件.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));
那么第四行中的assert将失败,因为自从第二行的assert以来,堆栈上的值的类型已经神奇地改变了。这是由于tolua_pushusertype()对其进行了更改-foo和foo.window具有相同的地址,并且在内部,tolua仅针对每个地址跟踪一个类型。如果对象是基类型SDL_Event,则tolua_isusertype()将会满足,但是这需要tolua_cclass声明在其第四个参数中具有"SDL_Event"。手动修复这个问题,两个assert都可以通过,但我每次无法手动更改它 - 我想修复tolua以解决此问题,但我还不足够了解它以完成这项任务。即使我能够这样做,我也不知道这是否是正确的做法。
我使用的是tolua 5.1.4,但是tolua++ 1.92.3也出现了相同的问题。
首先,我是否做错了什么?是否有办法重写我的声明,以便此工作与tolua as-is一起使用?或者,如果失败,有什么解决方案可以应用于tolua,以使其正常工作?
原文链接 https://stackoverflow.com/questions/9450228
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
我解决了这个问题!解决方案是像这样编辑我的 .pkg 文件:
struct SDL_WindowEvent : SDL_Event { int type; int windowID; };
这样可以使 tolua 明确类继承关系。我似乎太专注于 .pkg 文件内容是有效的 C 代码了。