SWIG是一个工具,它允许将C和C++代码转换为多个脚本语言,包括Lua。在SWIG中传递数组可能有点棘手,因为Lua不能直接处理数组。幸运的是,SWIG提供了一种方法可以轻松地将数组从C++代码传递到Lua脚本中。首先,您需要在SWIG接口文件中定义一个类型,该类型用于表示数组。要传递数组,您需要在翻译器中创建一个SWIG类型,并使用它将数组从C++代码传递到Lua脚本。

我目前有下面这个 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 . . .

有什么想法吗?

原文链接 https://stackoverflow.com/questions/557523

点赞
stackoverflow用户42136
stackoverflow用户42136

在接口定义中尝试写入:

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

根据文档,SWIG区分指针和数组。

2009-02-17 16:26:05
stackoverflow用户1752495
stackoverflow用户1752495

你可以使用 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)           # 创建一个数组
doubleArray_setitem(a,0,5.0)      # 将值5.0设置在索引0上
fun(a)                            # 传递给C
delete_doubleArray(a)             # 销毁数组
2017-12-15 12:53:04