Вопрос по python – Создание оболочки Swig для C ++ (указатели) на Python

3

Я очень новичок в Swig, и я пытаюсь создать оболочку Swig, чтобы использовать несколько файлов C ++ в Python. У меня есть следующий класс C ++.

Ниже приведен фрагмент кода, который я пытаюсь преобразовать:

/*packet_buffer.h*/
class CPacketBuffer {
 public:
    // construct based on given buffer, data is not copied
    CPacketBuffer(uint8_t* data, uint32_t length) {
        mpBuffer = data;
        mLength  = length;
        mHead    = 0;
        mTail    = length;
    }
    uint8_t* GetBuffer() {
        return (mpBuffer + mHead);
    }
    void Add(const uint8_t* data, uint32_t length) {
            if ((mTail + length) > mLength) {
            length = (mLength - mTail);
        }
//....
}

Я пытался написать файл example.i, который бы принимал указатели на typedefs (uint8_t *) сегодня весь день, используя справку из документации swig, но у меня не получилось.

Ниже приведен пробный файл packet_buffer.i, который не работает.

%module packet_buffer
%include typemaps.i
%apply unsigned char* {uint8_t*};
%apply unit8_t *INPUT {uint8_t *data};



%{
    #define SWIG_FILE_WITH_INIT
    #include "../include/packet_buffer.h"
%}
%include "../include/packet_buffer.h"
  1. How do I write a swig code for member functions that take pointers to typedefs?
  2. Can I write a common %apply that can be used across the code or will I have to write specifics for each INPUT, OUTPUT parameter?

Ваш Ответ

1   ответ
3

что проблема, с которой вы сталкиваетесь, заключается не в том, что они являются указателями, а в том, что они потенциально являются неограниченными массивами.

Вы можетедеформировать неограниченный массив C используя carrays.i и & quot;% array_class & quot; макрос, например:

%module packet
%include "stdint.i"

%{
    #include "packet.h"
%}

%include "carrays.i"
%array_class(uint8_t, buffer);

%include "packet.h"

Затем позволит вам в Python написать что-то вроде:

a = packet.buffer(10000000) 
p = packet.CPacketBuffer(a.cast(), 10000000)

Обратите внимание, что вам нужно убедиться, что срок службы буфера достаточен - если объект Python будет освобожден без уведомления кода C ++, вы получите неопределенное поведение.

Вы можете конвертироватьuint8_t* указатели (неограниченные массивы) для буферизации экземпляров в Python, используяfrompointer методы, которые%array_class макрос также создает, например:

r = packet.GetBuffer()
buf = packet.buffer_frompointer(r)

Вы можетедобавить дополнительный код Python при желании автоматизировать / скрыть большую часть преобразования между буферами или использоватьMemoryViews теснее интегрировать с Python на стороне C API.

В целом, хотя это C ++, я бы предложил использоватьstd::vector для этого - на стороне Python использовать намного приятнее, чем неограниченные массивы, а стоимость минимальна для безопасности и простоты, которую он вам дает.

Error: User Rate Limit Exceeded Guru Govindan
Error: User Rate Limit Exceededstd::vectorError: User Rate Limit ExceededveryError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Guru Govindan
Error: User Rate Limit Exceededstackoverflow.com/questions/10624736/… Guru Govindan

Похожие вопросы