在Python中,如何使用C ++函数通过**参数返回已分配的结构数组?

时间:2010-05-24 14:31:50

标签: python swig

我想在Python工具中使用一些现有的C ++代码NvTriStrip

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 个答案:

答案 0 :(得分:2)

您是否查看了SWIG关于其“cpointer.i”和“carray.i”库的文档?他们被发现here。这就是你必须操纵的东西,除非你想创建自己的实用程序库来包装代码。这是使用SWIG的Python处理指针的链接。

关于让它识别输入与输出的问题。他们在文档here中有另一部分,它正是如此描述的。你在* .i文件中标记了OUTPUT。所以在你的情况下你会写:

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

它为您提供了一个函数,它将bool和PrimitiveGroup*数组作为元组返回。

这有帮助吗?

答案 1 :(得分:2)

直接对事物进行python绑定实际上非常容易,我不知道为什么人们会为SWIG等令人困惑的包装器而烦恼。

只需对外部数组的每个元素使用Py_BuildValue一次,每行产生一个元组。将这些元组存储在C数组中。然后调用PyList_NewPyList_SetSlice生成元组列表,并从C函数返回列表指针。

答案 2 :(得分:1)

我不知道如何使用SWIG,但您可能需要考虑转移到更现代的绑定系统,如PyrexCython

例如,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