我正在尝试调用名为test2.lua的lua文件中的函数.这是test2.lua的内容:
function abc(path)
t = {}
table.insert(t, "a")
return t
end
Run Code Online (Sandbox Code Playgroud)
如您所见,它需要一个输入并返回一个字符串.
这是我的C代码.这很简单.然而我调用getglobal以调用该函数不起作用... lua_getglobal说我测试时它不是一个函数...这是什么原因?不应该abc是源文件中可返回的全局函数吗?为什么它只为这个全球性找到零呢?
L = lua_open();
luaL_openlibs(L);
luaL_loadfile(L, "src/test2.lua");
lua_getglobal(L, "abc");
lua_pushstring(L, "coollll");
int error = 0;
if ((error = lua_pcall(L, 1, 1, 0)) == 0)
{
std::cout << "cool";
}
Run Code Online (Sandbox Code Playgroud)
编辑:
调用lua_getglobal导致我的程序无论使用loadfile还是dofile都会破坏控制...任何想法为什么?
该函数luaL_loadfile()读取,解析和编译命名的Lua文件.它不执行任何内容.这在您的情况下很重要,因为语句function abc(path)... end在执行之前没有可见的效果.function您使用它的关键字等同于写作
abc = function(path)
t = {}
table.insert(t, "a")
return t
end
Run Code Online (Sandbox Code Playgroud)
在这种形式中,更清楚的是,abc在代码执行之前,名为变量的实际上并未赋值.
当luaL_loadfile()返回时,它推的Lua中栈是编译文件的结果顶部的匿名函数.你需要打电话给它,并且lua_pcall()会做到这一点.用以下内容替换您的引用luaL_loadfile():
if (luaL_loadfile(L, "src/test2.lua") || lua_pcall(L, 0, LUA_MULTRET, 0)) {
// do something with the error
}
Run Code Online (Sandbox Code Playgroud)
此时,test2.lua已执行,它定义的任何函数或其修改的其他全局变量都可用.
这是一个很常见的习惯用法,luaL_dofile()提供的功能是按名称加载和调用文件.
如图所示,您的代码中存在第二个更微妙的问题.该函数abc()使用一个名为的变量t,但您应该知道t使用的是一个全局变量.你可能想写local t = {}在顶部abc().