【问题标题】:How can SIP handle a C++ method that returns int*SIP 如何处理返回 int* 的 C++ 方法
【发布时间】:2011-03-06 06:09:31
【问题描述】:

我正在尝试将 C++ 库作为 Python 模块提供。看来 SIP 是完成这项工作的最佳工具。 (如有错误,请指正。)

一个类看起来程序员试图解决 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() 。更好的是有一个 Python 函数自动调用 getType(),然后调用其中一个 get???Value() 来获取值(如果需要,调用 getItemCount() 来确定数组长度,处理数组作为 numpy 或元组。

我当前的 .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();
};

提前致谢。我一直在努力寻找,但一无所获。

【问题讨论】:

    标签: c++ python swig python-sip


    【解决方案1】:

    我不知道 sip,但我使用 swig 将 C++ 包装到 python 模块中,这非常简单。 swig 可以自动处理大多数标准 C++ 数据类型(包括标准库容器)。

    【讨论】:

      【解决方案2】:

      您可以将 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
      };
      

      【讨论】:

        猜你喜欢
        • 2023-03-31
        • 1970-01-01
        • 1970-01-01
        • 2019-11-22
        • 1970-01-01
        • 1970-01-01
        • 2013-05-28
        • 2019-01-21
        • 2021-04-03
        相关资源
        最近更新 更多