SWIG Lua 和传递数组

Posted

技术标签:

【中文标题】SWIG Lua 和传递数组【英文标题】:SWIG Lua and passing arrays 【发布时间】:2010-10-08 03:16:15 【问题描述】:

我目前有以下lua代码:

    g = engine.CGeometry()

    vertexes = 

    vertexes[1] = 0
    vertexes[2] = 0
    vertexes[3] = 0

    vertexes[4] = 0
    vertexes[5] = -1
    vertexes[6] = 0

    vertexes[7] = -1
    vertexes[8] = 0
    vertexes[9] = 0

    print "adding vertexes"
    g:SetVertexes(vertexes)

其中 g:SetVertexes() 在 C++ 中实现为:

void CGeometry::SetVertexes(double* vertexes)
    this->vertexes = vertexes;

导致此错误:

adding vertexes
PANIC: unprotected error in call to Lua API (Error in SetVertexes (arg 2), expected 'double *' got 'table')
Press any key to continue . . .

有什么想法吗?

【问题讨论】:

顶点的数据类型是什么? 暂时我通过添加一个 SetVertex(int idx, double vertex) 来回避这个问题 我在使用 Python 时遇到了类似的问题。表(或 Python 中的列表)不会使用 SWIG 转换为数组。 【参考方案1】:

尝试写作:

void CGeometry::SetVertexes(double vertexes[]);

在接口定义中。从文档来看,SWIG 区分了指针和数组。

【讨论】:

有一次我将 double* vertexes 更改为 double vertexes[] 并得到了同样的错误【参考方案2】:

您可以按照此处所述使用 carrays.i 模块:http://www.swig.org/Doc1.3/Library.html

例如你在 C++ 中有这样的功能:

void fun(double arr[])  

然后你在 .i 文件中加载模块:

%include "carrays.i"
%array_functions(double, doubleArray);
void fun(double arr[]);

在 Lua 脚本中:

a = new_doubleArray(10)           # Create an array
doubleArray_setitem(a,0,5.0)      # Set value 5.0 on index 0
fun(a)                            # Pass to C
delete_doubleArray(a)             # Destroy array

【讨论】:

以上是关于SWIG Lua 和传递数组的主要内容,如果未能解决你的问题,请参考以下文章

使用 SWIG 从 Python 向 C 传递和数组参数

SWIG:Lua - 将 c++ 实例作为 lua 函数参数传递

通过 SWIG 将简单的 numpy 数组传递给 C

SWIG:如何将 C++ 对象数组从 C# 传递到 C++?

使用 SWIG 时如何将 int 数组和 List<string> 作为参数从 C# 传递给 C++

使用 SWIG 将 numpy 数组元素(int)传递给 c++ int