通过一个从C调用的函数遍历Lua中的表

时间:2013-12-22 23:34:29

标签: c 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;
}

谢谢!

1 个答案:

答案 0 :(得分:2)

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

在这里:

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

你不能在for in循环中使用lua表,除非你在某种程度上使t可调用(例如,使用__call)。更可能的是你可能只是想迭代它,在这种情况下你会使用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);
}
相关问题