SIP如何处理返回int*的C++方法

0 投票
2 回答
909 浏览
提问于 2025-04-16 13:05

我正在尝试把一个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();
};

提前谢谢你。我已经努力寻找,但一直没有找到答案。

2 个回答

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
};
0

我对sip不太了解,但我用过swig把C++代码封装成Python模块,这个过程相当简单。swig可以自动处理大多数标准的C++数据类型(包括标准库中的容器)。

撰写回答