【发布时间】:2013-11-18 13:22:20
【问题描述】:
我想知道如何从 C++ 端创建和注册一个函数,该函数在从 Lua 端调用时返回一个表。
我已经尝试了很多东西,但没有什么真正奏效。 :/
(抱歉,代码太长了) 例如,这不起作用,因为 Register() 需要一个“luaCFunction”样式的函数:
LuaPlus::LuaObject Test( LuaPlus::LuaState* state ) {
int top = state->GetTop();
std::string var( state->ToString(1) );
LuaPlus::LuaObject tableObj(state);
tableObj.AssignNewTable(state);
if (var == "aaa")
tableObj.SetString("x", "ABC");
else if (var == "bbb")
tableObj.SetString("x", "DEF");
tableObj.SetString("y", "XYZ");
return tableObj;
}
int main()
{
LuaPlus::LuaState* L = LuaPlus::LuaState::Create(true);
//without true I can't access the standard libraries like "math.","string."...
//with true, GetLastError returns 2 though (ERROR_FILE_NOT_FOUND)
//no side effects noticed though
LuaPlus::LuaObject globals = L->GetGlobals();
globals.Register("Test",Test);
char pPath[MAX_PATH];
GetCurrentDirectory(MAX_PATH,pPath);
strcat_s(pPath,MAX_PATH,"\\test.lua");
if(L->DoFile(pPath)) {
if( L->GetTop() == 1 ) // An error occured
std::cout << "An error occured: " << L->CheckString(1) << std::endl;
}
}
当我尝试将其设置为 luaCFunction 函数时,它只会崩溃 (0x3) 并说:
断言失败:0,文件 C:\......\luafunction.h,第 41 行
int Test( LuaPlus::LuaState* state ) {
int top = state->GetTop();
std::string var( state->ToString(1) );
LuaPlus::LuaObject tableObj(state);
tableObj.AssignNewTable(state);
if (var == "aaa")
tableObj.SetString("x", "ABC");
else if (var == "bbb")
tableObj.SetString("x", "DEF");
tableObj.SetString("y", "XYZ");
tableObj.Push();
return state->GetTop() - top;
}
为了澄清:从 Lua 方面我希望它可以像这样调用:
myVar = Test("aaa")
Print(myVar) -- output: ABC
编辑:打印功能来自here。基本上是这个不起作用的原因。 Print 只能打印字符串而不是表格...如果您只返回 1,上面的 C++ 代码就可以正常工作。
这是我的 LuaPlus 版本附带的文档:http://luaplus.funpic.de/
我真的希望你能帮助我.. 我已经开始认为这是不可能的。 :'(
编辑: 我完全忘了说使用 PushStack() 会导致错误,因为“该成员不存在”...
【问题讨论】:
-
如果将
return state->GetTop() - top;替换为return 1;会发生什么? (在Test函数的最后一行)errorString包含什么? -
是的,我得到了同样的错误。
-
你是如何从 C++ 调用测试脚本的?
-
LuaPlus 从 lua_pcall 得到错误,然后完全没有做任何事情。然后它失败了一个不提供额外信息的断言。该 errorString 变量(除非它被神奇地用于我没有看到的某个地方)很可能包含有用的信息。
-
不幸的是,所有这些混乱的最终结果是,我认为所写和问的问题完全不正确,最终对其他人没有帮助。我不知道 SO 指导方针是什么,但我可能会建议撤回这个问题,或者至少编辑它以包含正在运行的实际 lua 脚本和所涉及的打印功能。
标签: c++ function lua lua-table luaplus