Lua没有返回我的userdata。

我遇到了一些意外问题,涉及到我的userdatanewuserdata。送给C ++的数据与我创建userdata时存储的数据不同。下面是与创建有关的所有函数以及我正在调用的函数(

我用这段lua代码创建我的头像 :avatar = avatar_create(“hero1”) 在C ++中,是这样的

int LuaObjectFactory :: createAvatar(lua_State * L){
     自动头像 =新头像(lua_tostring(L,1)); //0x011afd20
     自动userdata = Util :: luaP_newuserdata <Avatar>(L,avatar); //0x011a4a18
     luaP_getScenes(L)-> getActiveScene()-> addEntity(avatar);
     Util :: luaP_setmetatable(L,Avatar :: lGetMetatable());
     返回1;
}
template <typename T> T ** luaP_newuserdata(lua_State * L,T * data){
     T ** o = static_cast <T **>(lua_newuserdata(L,sizeof(T *)));
     //不复制数据,仅记住对它的引用
     * o =数据;
     返回O;
}

inline void luaP_setmetatable(lua_State * L,const string&metatable){
     luaL_getmetatable(L,&metatable [0]);
     lua_setmetatable(L,-2);
}

template <typename T> T * luaP_touserdata(lua_State * L,int idx){
     return * static_cast <T **>(lua_touserdata(L,idx));
}

然后再后来,我尝试使用此lua代码调用Avatar的函数

avatar = avatar_create(“hero1”)
avatar:setPosition(12,10)
avatarPos = avatar:getPosition()

会调用这两个函数

template <typename T> static int lGetPosition(lua_State * L){
     auto p = Util :: luaP_touserdata <T>(L,1); //0x008ff0d8
     auto v = p->getPosition();
     lua_pushnumber(L,v.x);
     lua_pushnumber(L,v.y);
     返回0;
}

template <typename T> static int lSetPosition(lua_State * L){
     auto p = Util :: luaP_touserdata <T>(L,1); //0x008ff0d8
     auto v = Math :: Vector2(static_cast <int>(lua_tonumber(L,2)),
         static_cast <int>(lua_tonumber(L,3)));
     p->setPosition(v);
     返回0;
}

我注释了一个尝试调试的内存地址。 luaP_touserdata返回相同的地址,尽管即使在稍后尝试获取它们时,我在0x008ff0d8 中设置的值也已被删除。

还有一件我注意到的事情是0x008ff0d8的地址是指向指针的指针,指回0x008ff0d8

点赞
用户847349
用户847349

你为什么不使用专门的绑定层,例如luabridgeluabind?在面对代码混乱时,许多绑定库已经有效解决了低级问题。

甚至有些使用现代 c++ 的绑定库,例如 SeleneLuaGlue,或者是luawrapperluapp11

2014-06-27 09:11:07