我试图从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;
}
谢谢!
我注意到上面的几个问题正在引起问题。
在这里:
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);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句