C调用Lua函数报错:select参数类型不匹配问题排查
C调用Lua传Table报错的排查与解决
1. 先改函数名,避免和Lua标准库冲突
Lua自带一个select函数,作用是按索引取参数,第一个参数要求是数字。你自定义的函数也叫select,大概率是Lua没用到你的自定义函数,反而调用了标准库的select,传table过去自然会报类型错误。
赶紧把Lua里的函数名改成别的,比如sum_table,代码示例:
function sum_table(t) local total = 0 for _, num in ipairs(t) do total = total + num end return total end
2. 检查C端栈操作的顺序
调用Lua函数时,栈的顺序必须是先压函数,再压参数,最后调用lua_call。正确的操作流程示例:
// 1. 把自定义的sum_table函数压入栈 lua_getglobal(L, "sum_table"); // 2. 创建table并压栈(假设要传[10,20,30]) lua_createtable(L, 3, 0); // 预分配3个数组元素 // 给table赋值索引1-3 lua_pushnumber(L, 10); lua_rawseti(L, -2, 1); lua_pushnumber(L, 20); lua_rawseti(L, -2, 2); lua_pushnumber(L, 30); lua_rawseti(L, -2, 3); // 3. 调用函数:1个参数,1个返回值 lua_call(L, 1, 1); // 4. 取出返回的总和 int total = lua_tonumber(L, -1); lua_pop(L, 1); // 清理栈
如果你的栈顺序搞反了(比如先压table再压函数),或者参数数量和lua_call里的参数数不匹配,都会导致参数类型错误。
3. 加调试代码看栈状态
在调用lua_call前,加几行代码打印栈的状态,能快速定位问题:
printf("当前栈深度:%d\n", lua_gettop(L)); printf("栈顶元素类型:%s\n", lua_typename(L, lua_type(L, -1))); printf("栈顶下一个元素类型:%s\n", lua_typename(L, lua_type(L, -2)));
正常情况下,调用前栈里应该是:栈顶是table,下面是sum_table函数,栈深度为2。如果打印出来的类型不对,比如栈顶是函数,那就是顺序搞反了。
内容的提问来源于stack exchange,提问作者kos
相关产品推荐
相关产品推荐

