1

SWIGは初めてです。C++クラスを使用するPythonモジュールを作成しました。

私の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モジュールからダブルポインタを渡すにはどうすればよいですか?この問題を分類するのを手伝ってください。

4

1 に答える 1

2

コンストラクターでベクトルを直接使用し、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() { ... }
于 2012-11-15T15:44:34.047 に答える