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

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

SWIG легко обрабатывает функции с простыми параметрами, но основная функция, 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;
    }
};

Ответы [ 3 ]

2 голосов
/ 02 июня 2010

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

На ваш вопрос о том, как заставить его распознавать ввод и вывод. У них есть другой раздел в документации здесь , который описывает именно это. Вы помечаете вещи OUTPUT в файле * .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 голосов
/ 07 июня 2010

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

1 голос
/ 28 мая 2010

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

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

Удаление

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

cdef Shrubbery *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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...