1

私はクローズドソースのC++ライブラリを使用しました。これは、次と同等のコードを持つヘッダーファイルを提供します。

class CSomething
{
  public:
      void getParams( unsigned char & u8OutParamOne, 
                      unsigned char & u8OutParamTwo ) const;
  private:
      unsigned char u8OutParamOne_,
      unsigned char u8OutParamTwo_,
};

私はそれをPythonに公開しようとしています、私のラッパーコードは次のようなものです:

BOOST_PYTHON_MODULE(MySomething)
{
    class_<CSomething>("CSomething", init<>())
        .def("getParams", &CSomething::getParams,(args("one", "two")))

}

今私はPythonでそれを使おうとしていますが、それはひどく失敗します:

one, two = 0, 0
CSomething.getParams(one, two)

その結果:

ArgumentError: Python argument types in
    CSomething.getParams(CSomething, int, int)
did not match C++ signature:
    getParams(CSomething {lvalue}, unsigned char {lvalue} one, unsigned char {lvalue} two)

Boost.PythonラッパーコードまたはPythonコードのいずれかを機能させるために何を変更する必要がありますか?Boost.Pythonの魔法を追加して、自動的にキャストPyIntunsigned charたり、その逆を行うにはどうすればよいですか?

4

1 に答える 1

1

Boost.PythonlvaluePythonには存在しない概念である、欠落しているパラメーターについて不平を言っています。

def f(x):
  x = 1

y = 2
f(y)
print(y) # Prints 2

関数のxパラメーターはf、C++のような参照ではありません。C ++では、出力は異なります。

void f(int &x) {
  x = 1;
}

void main() {
  int y = 2;
  f(y);
  cout << y << endl; // Prints 1.
}

ここにはいくつかの選択肢があります。

a)関数をラップしてCSomething.getParams、新しいパラメーター値のタプルを返します。

one, two = 0, 0
one, two = CSomething.getParams(one, two)
print(one, two)

b)CSomething.getParams関数をラップして、クラスインスタンスをパラメータとして受け入れます。

class GPParameter:
  def __init__(self, one, two):
    self.one = one
    self.two = two

p = GPParameter(0, 0)
CSomething.getParams(p)
print(p.one, p.two)
于 2012-10-16T16:22:42.367 に答える