c - 在从 C 调用的函数中迭代 Lua 中的表

标签 c lua

我正在尝试从 C 调用 Lua 函数。Lu​​a 函数创建一个表,然后循环访问它。从 Lua 调用时它按预期工作,但当我从 C 程序调用它时却没有。有什么原因导致我不能做我在这里尝试的事情吗?

测试.lua:

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

测试.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;
}

谢谢!

最佳答案

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

这里:

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

关于c - 在从 C 调用的函数中迭代 Lua 中的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20735236/

相关文章:

c - 下面程序的输出是什么?

c - 在 pthread_create 中传递 char ***

c - C 中的特殊测试位函数

lua - 是否可以在 lua 中将一个单独定义的函数分配给一个对象作为对象的方法,可以访问 'self' ?

c - 从调试符号获取变量的堆栈偏移量

c - 从驱动程序启动应用程序

lua 新手 : C-Lua How to pass a struct/buffer to lua from C?

random - Redis Lua 脚本 math.random

math - 设置二维向量的大小

lua - 将多个返回值存储为命名表键