我的swig .i文件中有两个结构(实际上来自第三方库),如下所示:
typedef struct MY_STRUCT {
void* pParameter;
unsigned long pLen;
} MY_STRUCT;
%extend MY_STRUCT
{
MY_STRUCT()
{
MY_STRUCT *m= new MY_STRUCT();
m->pParameter = NULL;
m->pLen = 0;
return m;
}
}
typedef struct ANOTHER_STRUCT {
char * another;
unsigned long len;
} ANOTHER_STRUCT;
%extend ANOTHER_STRUCT
{
ANOTHER_STRUCT()
{
ANOTHER_STRUCT *p= new ANOTHER_STRUCT();
p->another = NULL;
p->len = 0;
return p;
}
unsigned long __len__()
{
return sizeof(ANOTHER_STRUCT);
}
}pParameter在MY_STRUCT中是一个空*,因为它可以是char *,也可以是指向结构(例如ANOTHER_STRUCT)的指针。使用%typemap(in) void* = char*;处理char *映射很简单,但是任何使用struct的尝试都会失败。下面是我想在Python中看到的:
s = MY_STRUCT()
another = ANOTHER_STRUCT()
s.pParameter = another # this should pass the struct pointer
s.pParameter = "some string" # or a char pointer if this is provided这个是可能的吗?如果没有,是否需要声明一些帮助函数来分配指针值?
发布于 2013-08-10 22:20:16
你可以喝一口就行了。不过,您将编写一个if来选择如何处理Python,这取决于您想要处理多少类型。下面是您需要的两个类型地图的完整示例:
%module test
%typemap(in) void* pParameter (int res=0, void *other_struct=NULL) %{
int len;
res = SWIG_ConvertPtr($input, &other_struct, $descriptor(struct ANOTHER_STRUCT*), 0);
if (SWIG_IsOK(res)) {
fprintf(stderr, "struct\n");
$1 = reinterpret_cast< ANOTHER_STRUCT * >(argp1);
len = sizeof(ANOTHER_STRUCT);
}
else if (PyString_Check($input)) {
$1 = PyString_AsString($input);
len = strlen((const char*)$1);
fprintf(stderr, "string\n");
}
//else if (...) {
//}
else {
SWIG_exception_fail(SWIG_TypeError, "some more details, see special typemap variables docs for ideas");
}
%}
%typemap(memberin) void* pParameter %{
$1 = $input; //fobar $self
$self->pLen = len;
%}
%inline %{
typedef struct MY_STRUCT {
void* pParameter;
unsigned long pLen;
} MY_STRUCT;
typedef struct ANOTHER_STRUCT {
} ANOTHER_STRUCT;
%}
%extend MY_STRUCT
{
MY_STRUCT()
{
MY_STRUCT *m= new MY_STRUCT;
m->pParameter = NULL;
m->pLen = 0;
return m;
}
}在这里,in类型图获取一个PyObject并计算出如何处理它。它还将长度保存到局部变量中。
memberin类型地图使用它来适当地设置void*和长度。
您可能需要考虑使pLen不可变(请参阅:%immutable),以便人们不能任意更改该指针。您还需要仔细考虑这种类型地图的内存所有权语义,以避免泄漏或双释放。
https://stackoverflow.com/questions/18109245
复制相似问题