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

3

我将尝试从C语言调用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
你难道不需要调用 load_dofile() 而非 lua_loadfile() 吗? - user529758
我相信luaL_dofile只是调用了lua_loadfile和lua_pcall:http://pgl.yoyo.org/luai/i/luaL_dofile - user693861
通常使用 lua_next 来完成这个操作。他们甚至在那里提供了一个示例。 - greatwolf
1个回答

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);
}

抱歉 - 我的意思是连接z和v,而不是t和v。使用C代码时,我简化了用于测试的原始Lua函数确实返回了一个字符串 - 我想我忘记了相应地编辑C代码。无论如何,在那些东西之前,Lua代码会给我一个错误,所以也没关系。无论如何,使用“pairs”进行迭代很有效,非常感谢。 - user693861

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接