在堆栈中将数组作为参数传递到C。
2014-9-20 4:55:35
收藏:0
阅读:91
评论:1
我使用Lua来操纵数组;数组是简单的二进制数据:
local ram_ctx = {0,0,0,0,0,0,0,0,0}
我想将它传递给用C编写的GUI。问题是,如果我直接传递它像func(ram_ctx),Lua函数似乎在调用后停止执行。相应的C函数没有被执行(它可以是空的)。但是如果我在Lua中创建全局数组并使用lua_getglobal来访问它,似乎一切正常。我做错了什么或者根本不可能吗?将数组名称作为参数传递以调用它作为全局数组是不可接受的。
Lua代码:
function device_init()
--set_callback(1000000000000, 0)
local array = {0xFF,0,0,0,0,0,0}
--create_memory_popup("Test")
set_memory_popup(array)
end
这是我尝试使用的C代码:
static int32_t lua_set_popup_memory (lua_State *L)
{
int32_t argnum = lua_gettop(L);
if (1 != argnum)
{
out_error("Function %s expects 1 argument got %d\n", __PRETTY_FUNCTION__, argnum);
return 0;
}
if (0 == lua_istable(L, -1))
{
out_log("No array found");
return 0;
}
int32_t a_size = lua_rawlen(L, -1);
uint8_t *buf = calloc(1, a_size);
for (int i=1;;i++)
{
lua_rawgeti(L,-1, i);
if (lua_isnil(L,-1))
break;
buf[i] = lua_tonumber(L,-1);
lua_pop(L, 1);
}
set_popup_memory(memory_popup, 0, buf, a_size);
free(buf);
return 0;
}
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的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 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
我怀疑如果没有完整的示例,没有人能够实际诊断所讨论的问题,但这里是处理Lua到C调用的惯用方式以及代码本身的一些注释:
static int // not int32_t lua_set_popup_memory(lua_State *L) { luaL_checktype(L, 1, LUA_TTABLE); // let alone excessive arguments (idiomatic), or do: lua_settop(L, 1); int a_size = lua_rawlen(L, 1); // absolute indexing for arguments uint8_t *buf = malloc((size_t)a_size); for (int i = 1; i <= a_size; i++) { lua_pushinteger(L, i); lua_gettable(L, 1); // always give a chance to metamethods // OTOH, metamethods are already broken here with lua_rawlen() // if you are on 5.2, use lua_len() if (lua_isnil(L, -1)) { // relative indexing for "locals" a_size = i-1; // fix actual size (e.g. 4th nil means a_size==3) break; } if (!lua_isnumber(L, -1)) // optional check return luaL_error(L, "item %d invalid (number required, got %s)", i, luaL_typename(L, -1)); lua_Integer b = lua_tointeger(L, -1); if (b < 0 || b > UINT8_MAX) // optional return luaL_error(L, "item %d out of range", i); buf[i-1] = b; // Lua is 1-based, C is 0-based lua_pop(L, 1); } set_popup_memory(memory_popup, 0, buf, a_size); free(buf); return 0; }请注意,
lua_CFunction的定义为int(*)(lua_State *),因此int32_t的返回类型可能(而且很可能)会在非32位平台上导致问题。此外,原始代码可能会溢出buf [i],因为C索引从零开始,而不是从1开 始。还有一个更明显的问题:lua_rawlen()可能会返回大于循环计数的索引(例如,带有nil-holes的数组),从而使不需要的零被传递给set_popup_memory(假设第一个nil方法的优先级高于表长度)。我不确定
out_error,使用Lua错误可能会给出更清晰的诊断,特别是当使用lua_pcall的回溯参数调用入口点时。此代码段未经过实际测试。