如何使用 Lua C API 在 C 语言中创建结构体
2020-11-16 9:24:48
收藏:0
阅读:251
评论:1
如何使用 Lua c api 创建以下 C 语言结构体?
typedef struct _c{
int d;
} obj_c;
typedef struct _b{
obj_c c[4];
}obj_b;
typedef struct _a{
obj_b b;
}obj_a;
obj_a a[4];
lua 中的上述结构 a[1].b.c[1].d = 1; 我尝试使用它,但它不起作用。 出错信息: PANIC: unprotected error in call to Lua API (attempt to index a number value)
在 lua 中 a[1].b.c = 1; 为了像这样使用,我编写了以下代码。 这个代码工作得很正常。
lua_createtable(L, 2, 0); // stack: {} : -1
{
lua_pushnumber(L, 1); // stack: {}, 1 : -2
{
lua_newtable(L); // stack: {}, 1, {} : -3
lua_createtable(L, 0, 1); // stack: {}, 1, {}, {} : -4
lua_pushnumber(L, 49);
lua_setfield(L, -2, "c");
lua_setfield(L, -2, "b");
lua_settable(L, -3);
}
lua_pushnumber(L, 2); // stack: {}, 2 : -2
{
lua_newtable(L); // stack: {}, 2, {} : -3
lua_createtable(L, 0, 1); // stack: {}, 2, {}, {} : -4
lua_pushstring(L, 50);
lua_setfield(L, -2, "c");
lua_setfield(L, -2, "b");
lua_settable(L, -3);
}
}
lua_pop(L, -2);
lua_setglobal(L, "a");
我该怎么做 a[1].b.c[1].d = 1; 是否可以以同样的形式制作?
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在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 代码?

首先您没有正确使用
lua_pop,其主要用途是从堆栈顶部删除指定数量的元素。在lua.h中#define lua_pop(n) lua_settop(L, -(n)-1),在您的例子中它将与lua_settop(L, 1)相同,但如果堆栈中有其他元素(如参数),它可能导致失败。在您的代码中,lua_pop根本不需要,因为在此行上您的堆栈已经填充了表格,所以它必须是:lua_createtable(L, 2, 0); // 堆栈:{} { lua_pushnumber(L, 1); // 堆栈:{},1 { lua_newtable(L); // 堆栈:{},1,{} lua_createtable(L, 0, 1); // 堆栈:{},1,{},{} lua_pushnumber(L, 49); lua_setfield(L, -2, "c"); // 堆栈:{},1,{},{c=49} lua_setfield(L, -2, "b"); // 堆栈:{},1,{b={c=49}} lua_settable(L, -3); // 堆栈:{1 = {b={c=49}}} } lua_pushnumber(L, 2); // 堆栈:{1 = {b={c=49}}},2 { lua_newtable(L); // 堆栈:{1 = {b={c=49}}},2,{} lua_createtable(L, 0, 1); // 堆栈:{1={b={c=49}}},2,{},{} lua_pushstring(L, 50); lua_setfield(L, -2, "c"); // 堆栈:{1={b={c=49}}},2,{},{c=50} lua_setfield(L, -2, "b"); // 堆栈:{1={b={c=49}}},2,{b={c=50}} lua_settable(L, -3); // 堆栈:{1={b={c=49}}, 2={b={c=50}}} } } lua_setglobal(L, "a"); // 堆栈已空,_G.a={ {b={c=49}}, {b={c=50}}}如果要将字段
c设置为表格数组,而不是使用lua_pushunmber(L, 49)和lua_pushnumber(L, 50),请将其替换为以下代码:lua_newtable(L); // 堆栈:...,{} lua_pushnumber(L, 1); // 堆栈:...,{},1 lua_newtable(L); // 堆栈:...,{},1,{} lua_pushnumber(L, 1); // 堆栈:...,{},1,{},1 lua_setfield(L, -2, "d"); // 堆栈:...,{},1,{d=1} lua_settable(L, -3); // 堆栈:...,{1={d=1}}因此,在您的堆栈中,数字将被填充为表格。
要创建类似于 C 中的空结构:
/*typedef struct _c{ int d; } obj_c; typedef struct _b{ obj_c c[4]; }obj_b; typedef struct _a{ obj_b b; }obj_a; obj_a a[4];*/ int i,j; lua_createtable(L, 4, 0); //obj_a[4] for (i = 1; i <= 4; i++) { //添加 4 个 obj_a 表格 lua_createtable(L, 0, 1); //obj_a lua_createtable(L, 4, 0); //obj_c[4] for (j = 1; j <= 4; j++) { //添加 4 个 obj_c 表格 lua_createtable(L, 0, 1); //obj_c lua_pushinteger(L, 0); //默认的 d 值 lua_setfield(L, -2, "d"); //{d=0} lua_seti(L, -2, j); //将 obj_c 表格添加到数组中 } lua_setfield(L, -2, "b"); // {b=obj_c[4]} lua_seti(L, -2, i); //将 obj_a 表格添加到数组中 } lua_setglobal(L, "a");