Lua 側から呼び出されたときにテーブルを返す関数を C++ 側から作成して登録する方法を知りたいです。
私は多くのことを試しましたが、何もうまくいきませんでした。:/
(長いコードで申し訳ありません) 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 , line 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 は、テーブルではなく文字列のみを出力できます...上記の C++ コードは、1 を返すだけで正常に動作します。
これは私の LuaPlus バージョンに付属のドキュメントです: http://luaplus.funpic.de/
あなたが私を助けてくれることを本当に願っています..私はすでにそれが不可能だと考え始めています. :'(
編集: 「メンバーが存在しない」ため、 PushStack() を使用するとエラーが発生することを完全に忘れていました...