Как SIP может обрабатывать метод C ++, который возвращает int * - PullRequest
0 голосов
/ 06 марта 2011

Я пытаюсь сделать библиотеку 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();
    ...
};

Я нигде не могу найти документацию, в которой говорится, как обрабатывать функции, возвращающие массивы. Как минимум, я хотел бы иметь возможность вызывать getIntArrayValue () из Python. Еще лучше было бы иметь одну функцию 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 голосов
/ 11 сентября 2018

Вы можете конвертировать ваш массив 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 голосов
/ 06 марта 2011

Я не знаю sip, но я использовал swig, чтобы обернуть C ++ в модуль python, и это было довольно просто. swig может автоматически обрабатывать большинство стандартных типов данных C ++ (включая контейнеры стандартной библиотеки).

...