Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pointers Lua如何在C++&&;将其传递回C++;_Pointers_Lua_Luabind - Fatal编程技术网

Pointers Lua如何在C++&&;将其传递回C++;

Pointers Lua如何在C++&&;将其传递回C++;,pointers,lua,luabind,Pointers,Lua,Luabind,现在我想传递一个指向Lua的void*指针,使用userdata? 如何做到这一点 顺便说一句,我使用了luabind,但它不能传递指向Lua堆栈的void*指针,这很烦人!你们能帮帮我吗 struct事件 { A*A; B*B; ... }; 事件*e; void*实例=(void*)e; //param是从Lua脚本传递的参数。param是一个事件对象。我把它扔进了一个空白的类型 字符串应答(void*param) { WorkEvent*pWorkEvent=静态强制转换(参数); ASS

现在我想传递一个指向Lua的
void*
指针,使用userdata? 如何做到这一点

顺便说一句,我使用了luabind,但它不能传递指向Lua堆栈的
void*
指针,这很烦人!你们能帮帮我吗

struct事件
{
A*A;
B*B;
...
};
事件*e;
void*实例=(void*)e;
//param是从Lua脚本传递的参数。param是一个事件对象。我把它扔进了一个空白的类型
字符串应答(void*param)
{
WorkEvent*pWorkEvent=静态强制转换(参数);
ASSERT_RET(pWorkEvent,NULL);
字符串调用_id=pWorkEvent->GetCallId();
CCmThreadManager::t类型thrd_id=pWorkEvent->GetHandleThrdID();
协同程序*pco=pWorkEvent->m_pco;

在讨论为什么不应该这样做之前,让我们先回答您的实际问题

LuaBind是一种将C++函数和对象绑定到Lua的工具。一个代码>空白> */COD>既不是函数也不是对象。它是一个指针,它对Lababink没有实际意义。因此,不能直接传递一个。 但是,您可以返回一个

luabind::object
,它可以表示任何Lua值。例如,一个Lua userdata。这意味着您可以从
void*
创建一些轻用户数据,将其粘贴到
luabind::object
中,并从您注册到luabind的函数返回它

luabind::object RegisteredFunction(..., lua_State *L)
{
  void *return_value = ...;

  lua_pushlightuserdata(L, return_value);
  luabind::object ret(luabind::from_stack(L, -1));
  lua_pop(L, 1);
  return ret;
}
要允许Lua将其传回以便您可以检索它,只需创建一个函数,将luabind::object作为
void*
参数:

void OtherRegisteredFunction(..., luabind::object obj, ...)
{
  assert(luabind::type(obj) == LUA_TLIGHTUSERDATA);
  obj.push();
  void *param = lua_touserdata(obj.interpreter(), -1);
  lua_pop(obj.interpreter(), 1);
}
这就是你传递这种数据的方式。这就是为什么你不应该这样做

首先,您的代码被破坏:

WorkEvent*pWorkEvent=静态_转换(参数);
假设你的代码> PARAM <代码>来自这行, Value*Unjy=(Vult*)E< /C>,C++不保证这能起作用。如果你将一个对象转换成 Value*/Cudio>,C++只提供了保证返回有用的东西的保证,如果你将它转换为与以前完全相同的对象。< /P> 您从
事件*
开始,然后将其转换为
无效*
。唯一合法的操作是将其转换回
事件*
。即使
工作事件
事件
的派生类,也不能将其直接转换为该类。您必须首先将其转换回
事件*
。此外,您应该使用
dynamic_cast
在发生
事件*
后进行向下转换

第二,停止使用
void*
s进行此操作。如果您的所有事件都是从
Event*
派生的,那么只需传递一个
Event*
并在适当的地方使用
dynamic\u cast
。如果不是,那么您应该这样做(LuaBind需要Boost,显然您已经在使用它).您不仅可以将其绑定到LuaBind(因为它是实际类型),而且使用它更自然


而且它具有内置的保护功能,可以完全避免您的代码以前遇到的问题;如果您试图将它强制转换为
工作事件,而只给它一个
事件,它将抛出一个异常。

我们不会直接在lua中使用void*。 这里我们使用c函数调用lua函数,然后使用lua函数调用c函数 在第一个c中,我们将一个void*传递给lua函数 然后lua将void*传递给第二个c函数

但是我们发现我们不能把一个空传给lua 当我们添加默认的_转换器void*时

namespace luabind
{
    template <>
    struct default_converter<void*> : native_converter_base<void*>
    {
        static int compute_score(lua_State * L, int index)
        {
            // this function will return 0 or -1 (int)
            return lua_type(L, index) == LUA_TLIGHTUSERDATA ? 0 : -1;
        }
        void* from(lua_State * L, int index)
        {
            return lua_touserdata(L, index);
        }
        void to(lua_State * L, void* value)
        {
            lua_pushlightuserdata(L, value);
        }
    };

} // namespace luabind
名称空间luabind
{
模板
结构默认\u转换器:本机\u转换器\u基
{
静态整数计算分数(lua\U状态*L,整数索引)
{
//此函数将返回0或-1(int)
返回lua_type(L,index)=lua_TLIGHTUSERDATA?0:-1;
}
void*from(lua_State*L,int索引)
{
返回lua_tuserdata(L,索引);
}
作废至(lua_状态*L,作废*值)
{
lua_pushlightuserdata(L,值);
}
};
}//名称空间luabind

您尝试了什么?请显示您的代码。在哪个系统上使用哪个版本的
lua
字符串回答(void*param){WorkEvent*pWorkEvent=static\u cast(param);ASSERT\u RET(pWorkEvent,NULL);字符串调用\u id=pWorkEvent->GetCallId();CCmThreadManager::TType thrd\u id=pWorkEvent->GetHandleThrdID()请把你的问题编辑起来,把你的代码放在问题中,而不是评论中。我已经发布了相关代码。你试过阅读了吗?那么,为什么你想在使用LuabDink时通过一个空洞?LuabDin是这样的,这样你就可以安全地操纵Lua的C++对象。好,我明白了。我必须找到另一个。解决我问题的方法。谢谢你。
namespace luabind
{
    template <>
    struct default_converter<void*> : native_converter_base<void*>
    {
        static int compute_score(lua_State * L, int index)
        {
            // this function will return 0 or -1 (int)
            return lua_type(L, index) == LUA_TLIGHTUSERDATA ? 0 : -1;
        }
        void* from(lua_State * L, int index)
        {
            return lua_touserdata(L, index);
        }
        void to(lua_State * L, void* value)
        {
            lua_pushlightuserdata(L, value);
        }
    };

} // namespace luabind