我正在尝试从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;
}
谢谢!
答案 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);
}