我想在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;
}
};
答案 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_New和PyList_SetSlice生成元组列表,并从C函数返回列表指针。
答案 2 :(得分:1)
我不知道如何使用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