lua API c的索引从10开始

llycmphe  于 2023-04-05  发布在  其他
关注(0)|答案(1)|浏览(125)

好吧,我想更好地解释一下栈索引在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 *keyconst 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);
}

我没有正确的返回值。
现在,如果我使用index1112都返回值
所以使用正索引的代码是

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开始,我如何修复这个问题,这样我就可以使用index45来接收keyvalue

7d7tgy0s

7d7tgy0s1#

如果你传递10个参数给Lua函数read_nested_table,那么Lua API栈中的可用索引从11开始。
您应该在lua_pushnil(L);之前调用lua_settop(L, 3);,以确保输入参数正好占用了3个堆栈槽,并且Lua API堆栈的索引4,5,...可用于C代码。

相关问题