SWIG Python - 包装一个需要指向结构的双指针的函数

Posted

技术标签:

【中文标题】SWIG Python - 包装一个需要指向结构的双指针的函数【英文标题】:SWIG Python - wrapping a function that expects a double pointer to a struct 【发布时间】:2012-11-14 14:42:09 【问题描述】:

我正在包装一个包含结构的 C 库:

struct SCIP

//...

以及创建这样一个结构的函数:

void SCIPcreate(SCIP** s)

SWIG 从中生成一个 python 类 SCIP 和一个函数 SCIPcreate(*args)

当我现在尝试在 python 中调用SCIPcreate() 时,它显然需要SCIP** 类型的参数,我应该如何创建这样的东西?

或者我应该尝试使用自动调用SCIPcreate() 的构造函数扩展SCIP 类吗?如果是这样,我会怎么做?

【问题讨论】:

【参考方案1】:

给定头文件:

struct SCIP ;

void SCIPcreate(struct SCIP **s) 
  *s = malloc(sizeof **s);

我们可以使用以下方法包装这个函数:

%module test
%
#include "test.h"
%

%typemap(in,numinputs=0) struct SCIP **s (struct SCIP *temp) 
  $1 = &temp;


%typemap(argout) struct SCIP **s 
  %set_output(SWIG_NewPointerObj(SWIG_as_voidptr(*$1), $*1_descriptor, SWIG_POINTER_OWN));


%include "test.h"

这是两个类型映射,一个用于创建一个本地临时指针,用作函数的输入,另一个用于将调用后指针的值复制到返回中。

作为替代方案,您还可以使用%inline 设置重载:

%newobject SCIPcreate;
%inline %
  struct SCIP *SCIPcreate() 
    struct SICP *temp;
    SCIPcreate(&temp);
    return temp;
  
%

【讨论】:

以上是关于SWIG Python - 包装一个需要指向结构的双指针的函数的主要内容,如果未能解决你的问题,请参考以下文章

SWIG python初始化一个指向NULL的指针

Python:SWIG:包装对结构的访问

将外部指针包装到 SWIG 数据结构中

使用python包装的c ++ SWIG模拟输入

Python:将数据从扭曲的套接字读取到 SWIG 结构中

在 Windows 中为 python 编译 SWIG 包装器