【发布时间】:2018-11-06 20:15:10
【问题描述】:
我正在尝试包装一个创建浮点数组的 C 函数,然后将该数组作为 Lua 表返回,以便在 Lua 中使用。
这是返回具有 4 个元素的浮点数组的 C 函数。
static void getArray(int size, float values[4]) {
for (int i=0; i<size; ++i)
values[i] = (float)i;
}
这是 .i 文件中的类型映射部分。
// using typemaps
%include <typemaps.i>
%apply (float OUTPUT[ANY]) {(float values[4])};
在Lua中,我可以使用如下函数,
arr = my.getArray(4); //table "arr" is now {0,1,2,3}
虽然这很好用,但我想知道是否可以创建一个可以返回可变浮点数组的 C 函数。
所以我认为函数应该是这样的。
static void getArray(int size, float **values) {
//create a float array and then return this as a table in Lua.
}
但是,我不知道如何将此函数与 SWIG 接口(.i) 绑定。
我尝试了我能做的所有事情,但到目前为止还没有成功。
谁能指导我如何使用 SWIG 包装这个函数,以便我可以在 Lua 中将可变浮点数组作为表返回?
P.S:这是 Lua SWIG 文档的链接。 http://www.swig.org/Doc1.3/Lua.html
------------添加在下面------ ------
@Flexo 根据您更新的解决方案,我可以成功绑定getArray 函数,如下所示。
static void getArray(const string &name, int *size, t_word **values) {
t_garray *a;
int vecsize;
t_word *vec;
if (getArrayData(name, &a, &vecsize, &vec)) {
*values = vec;
*size = vecsize;
}
}
这是我的 SWIG 界面。
%typemap(in,numinputs=0) (int *size, t_word **values) (t_word *tmp=NULL, int tsize=0) %{
$2 = &tmp; // Use the temporary we setup
$1 = &tsize;
%}
%typemap(argout) (int *size, t_word **values) {
int i;
lua_newtable(L);
for (i = 0; i < *$1; i++){
lua_pushnumber(L,(lua_Number)(*$2)[i].w_float);
lua_rawseti(L,-2,i+1);/* -1 is the number, -2 is the table*/
}
SWIG_arg++;
}
t_word 是一个用于数组的结构,它有一个浮点数据w_float。
我不需要释放任何东西,因为我没有分配新内存,而且它看起来就像一个魅力。
非常感谢您的帮助。我从你的代码中学到了很多东西。
【问题讨论】:
-
你的问题没有意义,如果你想在 C 中返回一些东西,你的函数原型应该是这样的:
float *getArray(int size);或int getArray(int size, float **result);。您混淆了 C 的基本规则,函数参数是本地的。 -
@Stargateur 谢谢我编辑了我的问题。我应该如何编辑类型映射以便它可以返回一个浮点数组?也许 SWIG 不可能?
-
我相信“23.4.4 Typemaps and pointer-pointer functions”中的文档会回答你。
-
@Stargateur 谢谢。我通过将
iMath更改为float尝试了该文档,但无法使其正常工作。如果我在 Lua 中调用ok,ptr=Create_Math(),我会得到ok的编号,它是 c 函数的返回值,但nil的ptr应该给出一个数字表。我只是稍微简化了我的问题。 -
@HenriMenke 我认为问题在于数组大小必须在当前解决方案的编译时固定。
标签: c lua swig lua-table typemaps