创建一个 SWIG typemap 以返回一个 vector of pairs 的函数
2018-8-31 7:24:13
收藏:0
阅读:83
评论:1
我正在尝试创建一个 getter 函数,该函数在 Lua 中返回一组双持续值的向量。
我有以下 C++ 中的 vector 数据:
{{1, "a"}, {2, "b"}, {3, "c"}}
我想将该向量作为表格在 Lua 中返回,这样可以与以下 Lua 表格 t
相同:
local t = {};
t[1].value = 1
t[1].name = "a"
t[2].value = 2
t[2].name = "b"
t[3].value = 3
t[3].name = "c"
以下是我的代码:
" MyBindings.h
"
#include "main.h"
class MyClass
{
public:
MyClass()
:MyData({{1, "a"}, {2, "b"}, {3, "c"}}){}
void getMyData(std::vector<pair<float, std::string>> *datap)
{
*datap = MyData;
}
std::vector<pair<float, std::string>> MyData;
};
" MyBindings.i
"
%module my
%{
#include "MyBindings.h"
%}
%include <stl.i>
%include <typemaps.i>
%include <std_string.i>
%include <std_vector.i>
/* 将输出的 std::vector<pair<float, std::string>> 转换为 lua_Table */
%typemap(in, numinputs = 0) (std::vector<pair<float, std::string>> *datap)
(std::vector<pair<float, std::string>> *tdatap = nullptr)
%{
%}
%typemap(argout) (std::vector<pair<float, std::string>> *datap)
{
lua_newtable(L);
for (size_t i = 0; i < $1->size(); ++i)
{
lua_newtable(L);
lua_pushinteger(L, static_cast<lua_Number>($1->at(i).first));
lua_setfield(L, -2, "value");
lua_pushstring(L, $1->at(i).second.c_str());
lua_setfield(L, -2, "name");
lua_rawseti(L, -2, i + 1);
}
SWIG_arg++;
}
%include "MyBindings.h"
" main.cpp
"
#include "main.h"
#include "lua.hpp"
extern "C"
{
int luaopen_my(lua_State *L);
}
int main()
{
lua_State *L = luaL_newstate();
luaL_openlibs(L);
luaopen_my(L);
lua_settop(L, 0);
luaL_dostring(L, "local c = my.MyClass()\n"
"local t = c:getMyData()\n"
"print('Value : ' .. t[2].value)\n"
"print('Name : ' .. t[2].name)\n");
lua_close(L);
}
我想要的结果:
Value : 2
Name : b
我得到的结果:
vector: Thread 1: EXC_BAD_ACCESS (code=1, address=0x10)
我应该如何更改我的代码以获得所需的结果?
原文链接 https://stackoverflow.com/questions/52110159
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
基本的解决方案是不使用输出参数(
argout
)。实际上,这是 C++ 编程的通用建议。在 C 时代,无法轻松地通过值从函数返回数组,因此需要输出参数。稍微重构一下之后,我得到了下面的代码:
MyBindings.h
#include <string> #include <utility> #include <vector> class MyClass { std::vector<std::pair<float, std::string>> m_data; public: MyClass() : m_data({{1, "a"}, {2, "b"}, {3, "c"}}) {} std::vector<std::pair<float, std::string>> data() { return m_data; } };
MyBindings.i
%module my %{ #include "MyBindings.h" %} %typemap(out) std::vector<std::pair<float, std::string>> { lua_newtable(L); for (size_t i = 0; i < $1.size(); ++i) { lua_newtable(L); lua_pushinteger(L, static_cast<lua_Number>($1.at(i).first)); lua_setfield(L, -2, "value"); lua_pushstring(L, $1.at(i).second.c_str()); lua_setfield(L, -2, "name"); lua_rawseti(L, -2, i + 1); } SWIG_arg++; } %include "MyBindings.h"
main.cpp
#include "lua.hpp" extern "C" { int luaopen_my(lua_State *L); } int main() { lua_State *L = luaL_newstate(); luaL_openlibs(L); luaopen_my(L); lua_settop(L, 0); luaL_dostring(L, "local c = my.MyClass()\n" "local t = c:data()\n" "print('Value : ' .. t[2].value)\n" "print('Name : ' .. t[2].name)\n"); lua_close(L); }
以下是一个示例调用:
$ swig -c++ -lua MyBindings.i $ clang++ -Wall -Wextra -Wpedantic -std=c++11 -I/usr/include/lua5.3 MyBindings_wrap.cxx main.cpp -llua5.3 $ ./a.out Value : 2 Name : b