В Python, как использовать функцию C++, которая возвращает выделенный массив структур через ** параметр?

Я хотел бы использовать некоторый существующий код C++, NvTriStrip, в инструменте Python.

ПОТЯНИТЕ легко обрабатывает функции с простыми параметрами, но основную функцию, GenerateStrips, намного более сложно.

Что я должен вставить файл интерфейса SWIG для указания на это primGroups действительно выходной параметр и что он должен быть очищен с delete[]?

///////////////////////////////////////////////////////////////////////////
// GenerateStrips()
//
// in_indices: input index list, the indices you would use to render
// in_numIndices: number of entries in in_indices
// primGroups: array of optimized/stripified PrimitiveGroups
// numGroups: number of groups returned
//
// Be sure to call delete[] on the returned primGroups to avoid leaking mem
//
bool GenerateStrips( const unsigned short* in_indices,
                     const unsigned int    in_numIndices,
                     PrimitiveGroup**      primGroups,
                     unsigned short*       numGroups,
                     bool                  validateEnabled = false );

К вашему сведению вот PrimitiveGroup объявление:

enum PrimType
{
    PT_LIST,
    PT_STRIP,
    PT_FAN
};

struct PrimitiveGroup
{
    PrimType type;
    unsigned int numIndices;
    unsigned short* indices;

    PrimitiveGroup() : type(PT_STRIP), numIndices(0), indices(NULL) {}
    ~PrimitiveGroup()
    {
        if(indices)
            delete[] indices;
        indices = NULL;
    }
};

6
задан Jon-Eric 24 May 2010 в 14:31
поделиться

3 ответа

Я не знаю, как это сделать с помощью SWIG, но вы можете рассмотреть возможность перехода на более современную систему связывания, такую как Pyrex или Cython.

Например, Pyrex дает вам доступ к C++ delete для подобных случаев. Вот отрывок из документации:

Disposal

Оператор del может быть применен к указателю на C++ struct для его удаления. Это эквивалентно delete в C++.

cdef Кустарник *big_sh
big_sh = new Shrubbery(42.0)
display_in_garden_show(big_sh)
del big_sh

http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/version/Doc/Manual/using_with_c++.html

1
ответ дан 17 December 2019 в 04:43
поделиться

Вы смотрели документацию SWIG относительно их библиотек "cpointer.i" и "carray.i"? Их можно найти здесь .Вот как вам нужно манипулировать вещами, если вы не хотите создавать свои собственные служебные библиотеки для сопровождения обернутого кода. Вот ссылка на обработку указателей Python с помощью SWIG .

К вопросу о том, как заставить его распознавать ввод по сравнению с выводом. У них есть еще один раздел в документации здесь , который описывает именно это. Вы помечаете вещи ВЫХОД в файле * .i. Итак, в вашем случае вы должны написать:

%inline{
extern bool GenerateStrips( const unsigned short* in_dices,
                            const unsigned short* in_numIndices,
                            PrimitiveGroup** OUTPUT,
                            unsigned short* numGroups,
                            bool validated );
%}

, что дает вам функцию, которая возвращает массивы bool и PrimitiveGroup * в виде кортежа.

Это поможет?

2
ответ дан 17 December 2019 в 04:43
поделиться

На самом деле так просто сделать привязки Python для вещей напрямую, что я не знаю, почему люди беспокоятся о запутанных обертках вроде SWIG.

Просто используйте Py_BuildValue один раз для каждого элемента внешнего массива, создавая один кортеж на строку. Сохраните эти кортежи в массиве C. Затем вызовите PyList_New и PyList_SetSlice , чтобы сгенерировать список кортежей и вернуть указатель на список из вашей функции C.

2
ответ дан 17 December 2019 в 04:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: