1

LUAPlus を使用して、Lua テーブル関数を C++ 変数にリンクしたいと考えています。これまでのところ、Web で見つけた情報を使用して、 を使用してテーブル関数をDoString("tableName:functionName")呼び出すことができましたが、変数を介して関数を呼び出せるようにしたいと考えています。その可能性はわかっていますが、何が間違っているのかわかりません。

私が追加したコードでは、正常にpLuaState->DoString("table1:prints()")動作し、必要に応じてすべてを出力します。関数を取得して func 変数を使用して呼び出そうとすると、プログラムがクラッシュします。

エラーメッセージ

アサーションに失敗しました: 0、ファイル .../luafunciton.h、41 行目

"print("in Prints")" を除く Lua の print() 関数のすべての印刷を削除すると、すべて正常に動作します。これに基づいてGetByName("functionName")、親テーブルへの参照を含まない関数を返すと仮定します。そして、これは私が立ち往生するところです。

main.cpp

pLuaState = LuaPlus::LuaState::Create(true);
pLuaState->DoFile("test.lua");
LuaObject globals = pLuaState->GetGlobals();

LuaObject metaTableObj = pLuaState->GetGlobals().Lookup("RandomMove");
if (metaTableObj.IsNil())
{
    metaTableObj = pLuaState->GetGlobals().CreateTable("RandomMove");
}
metaTableObj.SetObject("__index", metaTableObj);
metaTableObj.RegisterObjectDirect("GetX", (TestLua*)0, &TestLua::GetX);
metaTableObj.RegisterObjectDirect("SetX", (TestLua*)0, &TestLua::SetX);

TestLua obj1(6);
LuaObject table1Obj = pLuaState->GetGlobals().CreateTable("table1");
table1Obj.SetLightUserData("__object", &obj1);
table1Obj.SetObject("__index", metaTableObj);
table1Obj.SetMetaTable(metaTableObj);
pLuaState->DoString("table1:prints()");

auto prints = table1Obj.GetByName("prints");
if (!prints.IsFunction())
    cout << "nil function" << endl;
else
{
    LuaPlus::LuaFunction<void> func(prints);
    func();
}

test.lua

print("test.lua")

RandomMove = 
{
   _thing = 1
}

function RandomMove:SetThing()
    print("I am "..tostring(self.__object))
 end

function RandomMove:prints()
    print("in prints")
    print("__object is: " .. tostring(self.__object))
    print("_thing is: ".. tostring(self._thing))
    print(self:GetX())
end

どんな助けでも大歓迎です。

4

1 に答える 1