0

C++ライブラリをPythonモジュールとして利用できるようにしようとしています。SIPはその仕事に最適なツールのようです。(間違っている場合は、訂正してください。)

1つのクラスは、プログラマーがcの動的型付けの欠如を回避しようとしていたように見えます。

class Item{
  private:
    enum ITEMTYPE{TYPE_INT,TYPE_FLOAT,TYPE_INT_ARRAY,TYPE_FLOAT_ARRAY};
    enum ITEMTYPE type;
    int intValue;
    int* intArrayValue;
    float floatValue;
    float* floatArrayValue;
  public:
    enum ITEMTYPE getType();
    int getItemCount();
    int getIntValue();
    int* getIntArrayValue();
    float getFloatValue();
    float* getFloatArrayValue();
    ...
};

配列を返す関数の処理方法を説明しているドキュメントはどこにも見つかりません。少なくとも、PythonからgetIntArrayValue()を呼び出せるようにしたいと思います。さらに良いのは、getType()を自動的に呼び出してからget ??? Value()の1つを呼び出して値を取得する単一のPython関数を用意することです(必要に応じて、getItemCount()を呼び出して配列の長さを決定し、配列を処理しますnumpyまたはtuplesとして。

現在の.silファイルは次のようになります。

class Item{
%TypeHeaderCode
#include<Item.h>
%End
public:
  enum ITEMTYPE{
    TYPE_INT=0,
    TYPE_FLOAT=1,
    TYPE_INT_ARRAY=2,
    TYPE_FLOAT_ARRAY=3,
  };
  ITEMTYPE getType();
  int getItemCount();
  int getIntValue();
//int*getIntArrayValue();
  float getFloatValue();
//float*getFloatArrayValue();
};

前もって感謝します。私は一生懸命探してきましたが、空っぽになりました。

4

2 に答える 2

0

sipはわかりませんが、swigを使用してC ++をPythonモジュールにラップしましたが、これは非常に簡単でした。swigは、ほとんどの標準C ++データ型(標準ライブラリコンテナを含む)を自動的に処理できます。

于 2011-03-06T10:04:22.140 に答える
0

C++配列をPythonリストに変換できます。.sipファイル内:

class Item 
{
%TypeHeaderCode
#include<Item.h>
%End
public:
    ...

    SIP_PYLIST getIntArrayValue();
    %MethodCode
        int iSize = <your array size>; // We assume knowing the array size
        sipRes = PyList_New(iSize);
        for(int i=0; i<iSize; ++i)
            PyList_SetItem(sipRes, i, PyLong_FromLong(sipCpp->intArrayValue[i]));
    %End
};
于 2018-09-11T16:08:25.750 に答える