SWIG:无法使用双指针访问构造函数

Posted

技术标签:

【中文标题】SWIG:无法使用双指针访问构造函数【英文标题】:SWIG : Unable to access constructor with double pointer 【发布时间】:2012-11-15 06:24:52 【问题描述】:

我是 SWIG 的新手。我创建了一个 python 模块来使用 c++ 类。

我的cpp头代码是

GradedComplex.h:

class GradedComplex

public:
  typedef std::complex<double> dcomplex;
  typedef Item<dcomplex> item_type;
  typedef ItemComparator<dcomplex> comparator;
  typedef std::set<item_type, comparator> grade_type;

private:
  int n_;
  std::vector<grade_type *> grade_;
  std::vector<double> thre_;

public:
  GradedComplex(int n, double *thre);
  ~GradedComplex();

  void push(item_type item);
  void avg(double *buf);
;

而CPP代码是

#include <iostream>
#include "GradedComplex.h"
using namespace std;

GradedComplex::GradedComplex(int n, double *thre)

  n_ = n;
  for (int i = 0; i < n_; ++i)
  
    thre_.push_back(thre[i]);
    grade_.push_back(new grade_type());
  


GradedComplex::~GradedComplex()

  while (0 < grade_.size())
  
    delete grade_.back();
    grade_.pop_back();
  


void GradedComplex::push(item_type item)

  for (int i = 0; i < n_; ++i)
  
    if (item.norm() < thre_[i])
    
      grade_[i]->insert(item);
      break;
    
  


void GradedComplex::avg(double *buf)

  for (int i = 0; i < n_; ++i)
  
    int n = 0;
    double acc = .0l;
    for (grade_type::iterator it = grade_[i]->begin(); it != grade_[i]->end(); ++it)
    
      acc += (*it).norm();
      ++n;
    
    buf[i] = acc / n;
  

我的 SWIG 接口文件是:

example.i

/* File: example.i */
%module example
%
#include "Item.h"
#include "GradedComplex.h"
#include "GradedDouble.h"
%

%include <std_string.i>
%include <std_complex.i>
%include "Item.h"
%include "GradedComplex.h"
%include "GradedDouble.h"
%template(Int) Item<int>;
%template(Complex) Item<std::complex<double> >;

我已经通过运行*python setup.py build_ext --inplace*这个命令生成了python模块。

现在我想从 python 访问 GradedComplex(int n, double *thre)

当我尝试访问 GradedComplex 时,它显示 **TypeError: 在方法 'new_GradedComplex' 中,类型为 'double ' 的参数 2 错误*

如何从 python 模块传递双指针?请帮我解决这个问题。

【问题讨论】:

如何您尝试致电GradedComplex?你通过了哪些论据? 我已将这些 LEVEL = 3,thre = [1.0,10.0,100.0] 传递给 GradedComplex(LEVEL, thre) 【参考方案1】:

直接在构造函数中使用向量并利用 SWIG 的向量支持更简单:

.i 文件中:

%include <std_vector.i>
%template(DoubleVector) std::vector<double>;
%include "GradedComplex.h"

.h

GradedComplex(const std::vector<double>& dbls);

.cpp

GradedComplex::GradedComplex(const vector<double>& dbls) : thre_(dbls)


n_ 可以消失,因为thre_.size() 是一回事。

调用它:

c=Item.GradedComplex([1.2,3.4,5.6])

SWIG 也可以处理返回向量,所以 avg 可以是:

std::vector<double> GradedComplex::avg()  ... 

【讨论】:

参考此链接***.com/questions/13410691/…

以上是关于SWIG:无法使用双指针访问构造函数的主要内容,如果未能解决你的问题,请参考以下文章

Swig 中 C 指针的访问器函数

无法使用双指针作为函数参数传递二维数组[重复]

在无法访问库源的情况下使用 swig c++ 到 python

如何为双指针结构参数应用 SWIG 类型映射

SWIG C++ Python:通过引用或指针包装 int

无法从使用 SWIG 创建的 python 访问 C++ 扩展模块及其方法