我想知道如何从 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-function 时,它只是崩溃(0x3)并说:
Assertion failed: 0, file 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
编辑:打印功能来自这里。基本上是这个不起作用的原因。Print 只能打印字符串而不是表格...如果您只返回 1,上面的 C++ 代码就可以正常工作。
这是我的 LuaPlus 版本附带的文档:http: //luaplus.funpic.de/
我真的希望你能帮助我。我已经开始认为这是不可能的。:'(
编辑: 我完全忘了说使用 PushStack() 会导致错误,因为“该成员不存在”......