在从C调用的Lua函数中遍历Lua表。

我正在尝试从 C 中调用一个 Lua 函数。 Lua 函数创建一个表,然后遍历该表。当我从 Lua 中调用它时,它能够按预期工作,但当我从 C 程序中调用它时就无法工作。有什么原因我不能在这里尝试的吗?

test.lua:

function f()
    t = {["a"] = "aaa", ["b"] = "bbb", ["c"] = "ccc"}
    for z, v in t do
        print(t .. " " .. v)
    end
end

test.c:

#include <string.h>
#include <stdio.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>

int main(void)
{
    char read_buffer[1024];

    lua_State *L = lua_open();
    luaL_openlibs(L);
    if (luaL_loadfile(L, "test.lua") || lua_pcall(L, 0, 0, 0))
        fprintf(stderr, "Error loading test.lua");

    lua_getglobal(L, "f");

    if(lua_pcall(L, 0, 0, 0) != 0)
        fprintf(stderr, "error: %s\n", lua_tostring(L, -1));

    strncpy(read_buffer, lua_tostring(L, -1), sizeof(read_buffer));
    lua_pop(L, 1);
    printf("got from lua: %s\n", read_buffer);

    lua_close(L);

    return 0;
}

谢谢!

点赞
用户234175
用户234175

我注意到上面有几个问题会导致问题。

在这里:

function f()
  t = {["a"] = "aaa", ["b"] = "bbb", ["c"] = "ccc"}
  for z, v in t do
    print(t .. " " .. v)
  end
end

除非你让t以某种方式可调用(例如使用__call),否则不能在for in循环中像那样使用Lua表。更可能的是你只是想遍历它,这种情况下你需要使用pairs

  for z, v in pairs(t) do
  -- etc.

另一个错误是你正在尝试将字符串连接到表上。我不确定你想要做什么。也许你想要打印表地址?你可以使用tostring来实现。

我注意到的第二个问题是你的C代码:

if(lua_pcall(L, 0, 0, 0) != 0)

因此,你不想让f返回任何东西,除非出现错误。但是在此之后,你尝试将顶部项转换为字符串:

strncpy(read_buffer, lua_tostring(L, -1), sizeof(read_buffer));
lua_pop(L, 1);
printf("got from lua: %s\n", read_buffer);

这没有太多意义 - 此时可能没有任何内容在栈上。这显然是你代码中的逻辑错误。如果这应该是错误处理的一部分,你应该用花括号将它括起来,以便正确地作用域:

if(lua_pcall(L, 0, 0, 0) != 0)
{
    fprintf(stderr, "error: %s\n", lua_tostring(L, -1));
    strncpy(read_buffer, lua_tostring(L, -1), sizeof(read_buffer));
    lua_pop(L, 1);
    printf("got from lua: %s\n", read_buffer);
}
2013-12-23 04:03:03