好吧,我想更好地解释一下栈索引在lua中是如何工作的
我有一个表,其中有一些字段和一个子表。
表:
local mytable = {
enable = true,
timer = 60,
subtable = {
key1 = "value1",
key2 = "value2",
},
subtable2 = {
key1 = "value3",
key2 = "value4"
},
}
C代码:
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
#include <stdio.h>
int read_nested_table(lua_State *L) {
bool enable = lua_toboolean(L, 1);
int timer = lua_tointeger(L, 2);
luaL_checktype(L, 3, LUA_TTABLE);
lua_settop(L, 3);
lua_pushnil(L);
while (lua_next(L, 3) != 0) {
const char *key = lua_tostring(L, 4);
const char *value = lua_tostring(L, 5);
printf("%s: %s\n", key, value);
lua_pop(L, 1);
}
lua_settop(L, 4);
luaL_checktype(L, 4, LUA_TTABLE); // returning nil
lua_pushnil(L);
while (lua_next(L, 4) != 0) {
const char *key = lua_tostring(L, 5);
const char *value = lua_tostring(L, 6);
printf("%s: %s\n", key, value);
lua_pop(L, 1);
}
return 0;
}
int main() {
lua_State *L;
L = luaL_newstate();
luaL_openlibs(L);
lua_register(L, "read_nested_table", read_nested_table);
if (luaL_dofile(L, "myscript.lua") != 0) {
fprintf(stderr, "%s\n", lua_tostring(L, -1));
}
lua_close(L);
return 0;
}
代码按预期工作,这里的问题是索引
请注意,在const char *key
和const char *value
中,我使用了负索引
现在,当我尝试使用正索引时,例如:
while (lua_next(L, 3) != 0) {
const char *key = lua_tostring(L, 4);
const char *value = lua_tostring(L, 5);
printf("%s: %s\n", key, value);
lua_pop(L, 1);
}
我没有正确的返回值。
现在,如果我使用index11和12都返回值
所以使用正索引的代码是
while (lua_next(L, 3) != 0) {
const char *key = lua_tostring(L, 11);
const char *value = lua_tostring(L, 12);
printf("%s: %s\n", key, value);
lua_pop(L, 1);
}
我的索引从10开始,我如何修复这个问题,这样我就可以使用index4
和5
来接收key和value?
1条答案
按热度按时间7d7tgy0s1#
如果你传递10个参数给Lua函数
read_nested_table
,那么Lua API栈中的可用索引从11开始。您应该在
lua_pushnil(L);
之前调用lua_settop(L, 3);
,以确保输入参数正好占用了3个堆栈槽,并且Lua API堆栈的索引4,5,...可用于C代码。