我正在尝试从 C 调用 Lua 函数。Lua 函数创建一个表,然后循环访问它。从 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/