问题标签 [luabind]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
727 浏览

c - 将结构体地址从 C 传递到 Lua 并在 Lua 中访问其内容而无需复制数据

考虑我有一个数据包(网络数据包),它存储在 C 中的一个数组中。我在 Lua 中有一个可以处理这个数据包的模块。现在我需要将此数据包传递给 Lua 进行处理。我想避免复制数据。为此,我可以使用userdatalightuserdata。但是在这种情况下,基地址将被推送到堆栈顶部,我需要在 Lua 中编写回调或在 C 中为其编写元表。

我在如何开始用 C 编写一个基本的小回调时遇到了困难。我所需要的只是假设我有一个如下结构:

现在我有一个包含一些数据的数组。在 C 语言中,我可以使用这种结构对该数组进行类型转换以获取特定值。

我如何在 Lua 中做同样的事情,我已经传递了arr1堆栈顶部的地址并且结构是在 C 中定义的?我怎样才能得到变量的值ab在没有副本的 Lua

问题2

假设我正在使用 C 并使用 Lua 堆栈来处理数组。

如果我想访问a[2]a我的表在哪里,2 是索引,那么2需要在堆栈的顶部,我需要将a堆栈中的位置作为第二个参数传递给lua_gettable(). 我怎样才能对结构做同样的事情?我想访问结构的特定元素。怎么做?

0 投票
4 回答
1426 浏览

python - 嵌入在 C++ 中的 Lua 是否能够具有持久的局部变量?如果没有,是否有脚本语言可以做到?

我使用 LuaBind 在我的 C++ 应用程序中嵌入了 Lua。我需要有在多次运行中持续存在的变量,运行相同文件名的其他对象无法访问这些变量。

例如:假设我有一个名为NPC. AnNPC包含一个字符串,即它们运行的​​脚本的名称。创建an 时,NPC会创建一个名为 的变量Health。当一个NPC被击中时,他们会失去 5 点生命值。脚本在 Lua 中是这样的:

我遇到的问题是每个NPC运行这个脚本的人都没有自己的健康实例。例如,假设我创建NPC A,并从其生命值中减去 5。然后,我创建NPC B. 因为它会将生命值重置为 10,所以如果我告诉NPC A打印生命值,它会返回 10,即使它应该是 5。

如果我要为每个对象使用不同的 Lua 实例,那么它会以这种方式工作,但在这种情况下,我会一次得到数百个实例,我知道这不是一件好事。

有没有办法让变量在 Lua 中像这样工作?如果没有,是否有一种脚本语言可以有效地像这样工作?

作为参考,这是我正在测试的代码:

卢阿:

C++:

0 投票
2 回答
761 浏览

c++ - luabind : 从 lua 访问无效的 c++ 对象会导致访问冲突

如果对导出的类(对象)的成员函数调用是针对有效对象的,luabind 是否有可能进行检查?

假设我有一个使用 luabind 暴露给 lua 的名为 Actor 的类。我从 C++ 调用一个 lua 函数,并以一个 actor 对象作为参数。现在在函数完成之前,脚本编写会将actor对象放在全局lua引用中,以便稍后访问。

稍后,从 C++ 站点中删除了 actor 对象,调用了另一个函数来尝试访问无效的 actor 对象(其中的任何方法) - 显然,由于它已被删除,它会导致崩溃(访问冲突)

样本:

NIL 检查在这里没有帮助,这可以在 luabinds 网站上检查吗?这些函数使用 lua_pcall(....) 执行,堆栈跟踪显示 luabinds call.hpp results = maybe_yield(L, lua_gettop(L) - arguments, (Policies*)0) 处的错误;

如果没有,是否有另一种解决方案来确保编写脚本的人无法创建这些问题?

0 投票
2 回答
613 浏览

c++ - luabind - 超过 10 个参数的函数

我想在 luabind 中使用超过 10 个参数的函数,但是我得到了一些 C2784 和 C2780 编译器错误(VS2012 Express)。
似乎问题是使用的boost库的限制。在 luabind 中,可以设置 LUABIND_MAX_ARITY 选项,但这取决于 boost 可能的情况。我怎样才能克服这个限制?

谢谢!

代码:

函数insertIntfStats有大约 20 个 std::string 参数,仅此而已。其他两个函数的参数少于 8 个(std::string 也是如此)。当我注释 ".def("insertIntfStats", &WkmParserDB::insertIntfStats)" 行时,它会编译并工作。

错误:

0 投票
1 回答
290 浏览

luabind - Luabind pure_out_value 拒绝编译

我在让 Luabind 使用函数的“pure_out_value”属性时遇到了一些问题。就我而言,Luabind 在编译期间出错,说模板不包含使用该属性所需的特定功能。

使用的代码与 Luabind 附带的 test_policies.cpp 中的代码非常相似:

我尝试编译时遇到的错误:

环境的相关资料:

  • Lua 5.1.4(按位补丁)
  • Luabind 0.9.1
  • 提升 1.53
  • Visual Studio 2012 w/Update 1(使用 v110_xp 设置编译。)

我还尝试过使用 Luabind 的 5.2 补丁版本(仍然支持 5.1),可以在这里找到: https ://bitbucket.org/cinderblocks/luabind

Luabind 的其余部分似乎工作正常,但不是 pure_out_value 策略。

0 投票
1 回答
645 浏览

c++ - 使用 Luabind 比较存储的 C++ 对象指针时,Lua 函数崩溃

我刚刚开始使用 Luabind 和 C++。我的目标很简单:

我想创建一个 Lua 函数,它将 C++ 对象指针作为参数并将对象存储在 Lua 变量中。每次调用 Lua 函数时,它应该首先检查传递给它的对象指针是否与上一次调用期间存储的对象指针相同。

这是完整的代码:

当我运行这个程序时,我希望看到以下输出:

但是,当我运行该程序时,它在“x”和“v”之间的比较期间第二次调用 Lua 函数时崩溃。这是程序的实际输出:

可以看出,在设置“v”之前和之后的第一个函数调用期间,比较都有效。但是,在调用第二个函数期间,第一次比较失败。

我一定错过了一些非常明显的东西,但我真的不知道它是什么。谁能看到我做错了什么?非常感谢任何建议!

非常感谢你,马丁

0 投票
1 回答
624 浏览

c++ - 如何让 Luabind 属性工作?

我在导入类时尝试使用 Luabind 的属性。定义都是正确的,我敢肯定,但是当我调用一个属性时,例如如果它是一个字符串或数字就打印它,我会得到这样的东西

功能:009EC440

现在我不知道为什么会发生这种情况,但我在互联网上环顾四周,发现有几个人有同样的问题。他们说您应该使用以下参数构建 Luabind:

bjam 工具集=msvc-9.0 变体=调试线程=多链接=共享定义=_BIND_TO_CURRENT_VCLIBS_VERSION

现在我已经尝试过了,但我仍然得到同样的错误。另一件需要注意的是,我使用的是 MSVC 2012,所以我尝试使用 toolset=msvc-11.0 构建它,但再次无济于事。我已经读过,如果您不使用 Boost build 来构建您的项目,您需要定义 LUABIND_DYNAMIC_LINK,这在包含 Luabind 之前也已完成。这仍然导致此错误。我也尝试过自己构建 Luabind,但在链接它时遇到了麻烦,因为它会引发许多符号错误(我不确定在哪里定义 LUABIND_DYNAMIC_LINK,所以如果有人知道这可能会解决问题)。有谁知道如何解决这个问题?


下面是声明属性的代码:

他们正试图像这样被访问,武器是 Weapon 类的一个实例,正如它的构造函数声明的那样:


静态链接有效,但我想使用以下参数使其与动态链接一起使用:

bjam 工具集=msvc-9.0 变体=调试线程=多链接=静态定义=_BIND_TO_CURRENT_VCLIBS_VERSION

0 投票
1 回答
317 浏览

c++ - 如何使用 luabind 在脚本中正确加载文件?

我正在尝试将 Lua 嵌入到游戏中。我想要做的是创建一个加载函数,它将加载文件夹中的所有文件,然后根据将存储在 C++ 端的文件创建对象。但是,如果我使用 dofile 之类的东西,它会用该文件中的变量污染所有内容。如何将此导入更改为本地导入?

0 投票
1 回答
1276 浏览

c++ - Luabind:无法返回 shared_ptr

我正在尝试从与 Luabind 绑定的方法返回 std::shared_ptr,但它似乎无法识别该类型。

Luabind 代码:

创建字符代码:

如果我在 Lua 脚本中调用此方法,则不会返回任何内容,并且执行会停在那里。但是,如果我将方法更改为返回 Character*,它会按预期工作。一些谷歌搜索告诉我返回 shared_ptr 应该不是问题。

我究竟做错了什么?

另外,我有这段代码,所以 Luabind 可以理解 std::shared_ptr:

0 投票
1 回答
209 浏览

c++ - 使用从 C++ 对象到另一个 C++ 对象的指针来修改 Lua 中的成员变量

如何在 Lua 脚本中从另一个 C++ 对象获取对 C++ 对象的引用?我真的不知道如何正确地用文字来总结,所以让我先用一个 Lua 例子来详细说明:

a 是一个 C++ 对象,函数 getComponent 返回一个指针:

似乎问题在于getComponent()将 Component 对象的副本传递给 Lua,而不是引用。我对每个返回指针的函数都遇到了同样的问题,Lua 无法修改原始对象。

对象 a 似乎工作正常,如果我从 Lua 中修改一个变量,它的结果会反映在 C++ 中。A 和 component 都已经绑定到 Lua,以及所需的方法。

我是否在语法上遗漏了一些东西,或者还有更多的东西?

我正在使用 luabind、Lua 5.1 和 MinGW。感谢您提前提供任何帮助。

编辑

这是 luabind 代码。我总结了它,因为还有一堆与问题无关的其他绑定: