Lua没有返回我的用户数据

时间:2014-06-13 12:06:47

标签: c++ lua

我的touserdata和newuserdata遇到了一些意想不到的问题,传递给C ++的数据与我创建userdata时存储的数据不同,下面我有与创建和功能相关的所有功能我打电话给你(

我用这个lua代码创建我的头像avatar = avatar_create(" hero1") 在c ++中是这个

int LuaObjectFactory::createAvatar(lua_State* L){ 
    auto avatar = new Avatar(lua_tostring(L, 1)); // 0x011afd20
    auto userdata = Util::luaP_newuserdata<Avatar>(L, avatar); // 0x011a4a18
    luaP_getScenes(L)->getActiveScene()->addEntity(avatar); 
    Util::luaP_setmetatable(L, Avatar::lGetMetatable());
    return 1;
}
template<typename T> T** luaP_newuserdata(lua_State* L, T* data){
    T** o = static_cast<T**>(lua_newuserdata(L, sizeof(T*)));
    // Does not copy the data, only remembers reference to it
    *o = data;
    return 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);
    return 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);
    return 0;
}

我评论了从我的调试尝试返回的内存地址,luaP_touserdata返回相同的地址,尽管我在0x008ff0d8上设置的值已经被删除了以后我去了它们

我注意到的另一件事是0x008ff0d8的地址是一个指向指针的指针,指针指向0x008ff0d8。

1 个答案:

答案 0 :(得分:1)

为什么不使用专用绑定层,例如luabridgeluabind?您在意大利面条代码中遇到的低级问题在许多绑定库中得到了有效解决。

甚至有一些使用现代c ++,例如SeleneLuaGlueluawrapperluapp11