Как набрать C ++ INT ** возвращаемое значение в Python с Swig - PullRequest
0 голосов
/ 28 мая 2018

Ниже приведен мой код:

int** myfunction()
{
    int **value = new int*[4];
    for(int i=0;i<4;i++)
    {
        value[i] = new int[4];
        memset(value[i], 0, 4*sizeof(int));
    }
    // asign value

    return value;
}

, затем я хочу позвонить myfunction и получить возвращенное int ** значение типа со списком Python, поэтому я добавляю карту типов в мой .i файл:

%typemap(out) int** {
    $result = PyList_New(4);
    for(int i=0;i<4;i++)
    {
        PyObject *o = PyList_New(4);
        for(int j=0;j<4;j++)
        {
            PyList_SetItem(o,j,PyInt_FromLong((long)$1[i][j]));
        }
        PyList_SetItem($result, i, o);
    }
    delete $1;
}

Я звоню myfunction в своем коде Python и ничего не получаю.Что не так в моем коде?

1 Ответ

0 голосов
/ 29 мая 2018

Кроме утечки памяти (удаляются только внешние new, а не внутренние), ваш код выглядит нормально.Вот что я сделал:

test.i

%module test

%typemap(out) int** {
    $result = PyList_New(4);
    for(int i=0;i<4;i++)
    {
        PyObject *o = PyList_New(4);
        for(int j=0;j<4;j++)
        {
            PyList_SetItem(o,j,PyInt_FromLong((long)$1[i][j]));
        }
        delete [] $1[i];
        PyList_SetItem($result, i, o);
    }
    delete [] $1;
}

%inline %{
int** myfunction()
{
    int **value = new int*[4];
    for(int i=0;i<4;i++)
    {
        value[i] = new int[4];
        for(int j=0;j<4;j++)
            value[i][j] = i*4+j;
    }

    return value;
}
%}

Построен с компилятором SWIG и VS2015:

swig -c++ -python test.i
cl /EHsc /LD /W3 /MD /Fe_test.pyd /Ic:\python36\include test_wrap.cxx -link /libpath:c:\python36\libs

Вывод:

>>> import test
>>> test.myfunction()
[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15]]
...