SWIG Lua и проходящие массивы - PullRequest
4 голосов
/ 17 февраля 2009

У меня сейчас есть следующий код 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 . . .

Есть идеи?

Ответы [ 2 ]

1 голос
/ 17 февраля 2009

Попробуйте написать:

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

в определении интерфейса. Судя по документации, SWIG различает указатели и массивы.

0 голосов
/ 15 декабря 2017

Вы можете использовать модуль 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
...