- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我目前在使用 Luabind 将 Lua 脚本 AI 与 C++ 游戏交互时遇到问题。
我在一个循环中调用一个更新函数(每帧一次),这个函数从 Luabind 中注册的 C++ 函数中检索信息。
我的问题如下:在可变的、不可预测的时间之后,Luabind 中出现断言失败,导致中止。错误总是在/usr/include/luabind/wrapper_base.hpp:124 中下降时发生Lua.
您知道什么可以做到这一点吗?对于我的测试,C++ 和 LUA 中调用的函数总是相同的。
关于问题的更多细节:
wrapper_base.hpp 中失败断言的内容
typedef typename boost::mpl::if_<boost::is_void<R>, luabind::detail::proxy_member_void_caller<boost::tuples::tuple<BOOST_PP_ENUM(BOOST_PP_ITERATION(), LUABIND_TUPLE_PARAMS, _)> >
, luabind::detail::proxy_member_caller<R, boost::tuples::tuple<BOOST_PP_ENUM(BOOST_PP_ITERATION(), LUABIND_TUPLE_PARAMS, _)> > >::type proxy_type;
// Comments removed
lua_State* L = m_self.state();
m_self.get(L);
assert(!lua_isnil(L, -1));
detail::do_call_member_selection(L, name);
if (lua_isnil(L, -1))
{
lua_pop(L, 1);
throw std::runtime_error("Attempt to call nonexistent function");
}
// push the self reference as the first parameter
m_self.get(L);
// now the function and self objects
// are on the stack. These will both
// be popped by pcall
return proxy_type(L, args);
确切的错误
bomberman: /usr/include/luabind/wrapper_base.hpp:124: typename boost::mpl::if_<boost::is_void<T>, luabind::detail::proxy_member_void_caller<boost::tuples::tuple<boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> >, luabind::detail::proxy_member_caller<R, boost::tuples::tuple<boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type,
boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> > >::type luabind::wrap_base::call(const char*, luabind::detail::type_<Derived>*) const [with R = void]:
Assertion `!(lua_type(L, (-1)) == 0)' failed.
Aborted (core dumped)
最佳答案
几天前我遇到了这个问题。在我的特殊情况下,隐式创建的 Lua 表保存了在 Lua 中为每个对象覆盖的所有方法,正在被垃圾收集,而底层 C++ 对象则没有。因此,如果您尝试从 C++ 对象调用 Lua 成员函数,它将失败。
在我的案例中,解决方案是只要 C++ 实例处于事件状态,就保持对 lua 表的引用处于事件状态。这就像在 C++ 类中添加一个 luabind::object 字段然后在实例化类时设置它一样简单,当 C++ 类的析构函数被调用时它将被销毁,所以在大多数情况下你不必担心内存泄漏。我的代码现在看起来像这样:
class LuaC : public BaseC, public luabind::wrap_base {
private:
luabind::object _self; //retain a reference to the Lua part of this object so it doesn't get gc'd
public:
void setSelf(luabind::object nSelf) { _self=nSelf; }
};
//expose LuaC including the method setSelf
// ...
(BaseC 是您要包装的 C++ 类)
然后在 Lua 中,无论何时实例化 LuaC 的实例,调用 setSelf 并将 self 作为附加参数传递
c = LuaC()
c:setSelf(self)
如果没有一种方法可以简化它并将其全部放入 LuaC 构造函数中以减少出错(即您不必担心每次都调用 setSelf),我会感到惊讶。但是 LuaBind 的文档相当浅,所以我找不到任何方法来做到这一点。
此外,我认为出现此问题的唯一方法是,如果您告诉 Luabind 仅使用像 shared_ptr
这样的引用,因为这样 Lua 部分将与 shared_ptr 一起被垃圾收集,但不一定是指针引用的 C++ 实例。如果 Lua 正在管理整个实例,那么我看不出在 C++ 实例继续存在时如何删除 Lua 表。
关于c++ - Luabind 断言失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6236827/
我刚刚开始使用 Luabind,并尝试运行在 http://www.rasterbar.com/products/luabind/docs.html#calling-lua-functions 指定的
我在理解如何通过 luabind 正确使用协程时遇到一些问题。有一个模板函数: template Ret resume_function(object const& obj, ...) 其中 (Ret
我对 Luabind 包装器如何在没有 lua_State *L 的情况下传递函数感兴趣。并且不使用 Lua 堆栈。 Luabind 如何: 计算函数参数? 将函数参数链接到 Lua 堆栈? 链接这些
我有一个 C++ 类,我想通过全局变量在 lua 脚本中授予访问权限,但是当我尝试使用它时,出现以下错误: terminate called after throwing an instance of
我在使用 luabind 时遇到了问题。我定义了一个 std::map 来分配在 lua 中创建的对象。我以这种方式将这张 map 发布为 lua 中的全局对象: luabind::globals(L
在一个名为 Test_Class 的类中,我有一个函数: shoot_a_bullet(int damage) { cout > x; lua_State *myLuaState =
我在 Lua 中创建表并将它们存储为 Luabind 对象。然后,我希望调用存储在这些表之一中的函数,所以我会做这样的事情 data["onPrimaryFire"](player, x, y, a)
我最近一直在学习 Luabind,目的是将其集成到我们的软件中。我遇到了几个问题,我一直在查看 Luabind 的 Rasterbar 软件文档,但未能解决。基本上,我公开了一个以字符串和抽象基类作为
我想创建一个具有动态属性的类。例如: class MyClass { public: int GetValue(string str) { return smap[st
我想问一个关于其中发生的特定事件的问题,而无需深入探讨我正在从事的大型 multimap 书馆项目的太多无关细节。我正在使用 Luabind 使我的 C++ 代码与我的 Lua 代码接口(interf
我正在尝试从类中导出静态字段: class Foo { const static int Var; }; // luabind module: .def_readonly("Var", &Foo
我试图在 Visual Studio 2010 中使用 Lua + Luabind 制作一些 HelloWorld。我从 here 下载了 Lua src。并将其源文件添加到项目中。然后我下载并添加了
我使用的是来自 Ryan Pavlik 主发行版的 luabind 0.9.1 和 Lua 5.1,Win XP SP3 上的 cygwin + 最新补丁 x86,boost 1.48,gcc 4.3
我目前在使用 Luabind 将 Lua 脚本 AI 与 C++ 游戏交互时遇到问题。 我在一个循环中调用一个更新函数(每帧一次),这个函数从 Luabind 中注册的 C++ 函数中检索信息。 我的
我正在尝试为我的项目编译 Luabind,但收效甚微。我有 lua 目录(包含 src、makefile 等)作为 luabind 的兄弟。我将 LUA_PATH 设置为/my/dirs/lua 文件
我有一些使用 Luabind 的代码,如果它存在于 _G 表中,我需要执行一个函数(来自 C++),否则什么都不做。如何检测_G中是否存在函数? 最佳答案 这样的事情应该工作: if (luabind
我想向 Lua 等公开 Java 类。对于 C/C++,有 luabind 项目。但我还没有找到 Java 的类似内容。Java 有没有类似 luabind 的项目? 最佳答案 也有一些可用于 JAV
如何追踪我的合规订单? (这样我就可以重新订购) 我的问题:我正在运行 Visual Studio 2012 编写 C++ 应用程序。我使用 LuaBind 将脚本系统 Lua 绑定(bind)到我的
我正在学习 luabind 并尝试使用 luabind::object 从 C++ 访问 Lua 中的变量。 当我将一个 int 分配给一个“对象”时,编译失败了。 代码: int main() {
luabind 文档说要从 C++ 调用 Lua 派生的虚拟成员,您可以创建一个派生自 luabind::wrap_base 的包装类,然后像这样调用该函数: class BaseWrapper :
我是一名优秀的程序员,十分优秀!