gpt4 book ai didi

c++ - Lua 不返回我的用户数据

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:22:19 25 4
gpt4 key购买 nike

我的 touserdata 和 newuserdata 一直有一些意想不到的问题,传递给 C++ 的数据与我创建用户数据时存储的数据不同,下面是与创建相关的所有函数以及我使用的函数'呼唤 (

我用这个 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 的指针的指针。

最佳答案

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

甚至还有一些使用现代c++的,比如SeleneLuaGlueluawrapperluapp11

关于c++ - Lua 不返回我的用户数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24204914/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com