python — использование stdint с swig и numpy.i

Я разрабатываю модуль для использования c inline в коде Python на основе swig,
Для этого я хотел бы сделать numpy массивы доступны в C, До сих пор я использовал такие типы C, как unsigned short но я хотел бы использовать такие типы, как uint16_t от stdint.h чтобы сохранить любой компилятор, с которым сталкивается мой модуль.

К сожалению c++-функции не переносятся правильно при использовании stdint.hтипы. Данная ошибка: _setc() takes exactly 2 arguments (1 given), Это означает, что функция не обернута, чтобы принять numpy массивы. Ошибка не возникает, когда я использую, например, unsigned short,

Есть ли у вас какие-либо идеи, как я могу сделать карту Swig numpy массивы в stdint-types?

interface.i Не работает:

/* interface.i */
extern int __g();
%}
%include "stdint.i"%include "numpy.i"
%init %{
import_array();
%}
%apply (uint16_t* INPLACE_ARRAY3, int DIM1) {(uint16_t* seq, int n1)};
extern int __g();

c++ функция НЕ работает:

#include "Python.h"#include <stdio.h>
#include <stdint.h>
extern uint16_t* c;
extern int Dc;
extern int Nc[4];
void _setc(uint16_t *seq, int n1, int n2, int n3)
{
c = seq;
Nc[0] = n1;
Nc[1] = n2;
Nc[2] = n3;
}

interface.i за работой:

/* interface.i */
extern int __g();
%}
%include "stdint.i"%include "numpy.i"
%init %{
import_array();
%}
%apply (unsigned short* INPLACE_ARRAY3, int DIM1) {(unsigned short* seq, int n1)};
extern int __g();

c++ функция работает:

#include "Python.h"#include <stdio.h>
#include <stdint.h>
extern unsigned short* c;
extern int Dc;
extern int Nc[4];
void _setc(unsigned short *seq, int n1, int n2, int n3)
{
c = seq;
Nc[0] = n1;
Nc[1] = n2;
Nc[2] = n3;
}

3

Решение

Ха-ха, я нашел какое-то «решение» всего через несколько минут после того, как я сдался и разместил этот вопрос.

Я редактировал numpy.iчтобы соответствовать моему делу:
Я заменил старый C типы с stdint.h наберите в строках 3044 и далее:

[..]
/* Concrete instances of the %numpy_typemaps() macro: Each invocation
* below applies all of the typemaps above to the specified data type.
*/
%numpy_typemaps(int8_t       , NPY_BYTE     , int)
%numpy_typemaps(uint8_t     , NPY_UBYTE    , int)
%numpy_typemaps(int16_t             , NPY_SHORT    , int)
%numpy_typemaps(uint16_t    , NPY_USHORT   , int)
%numpy_typemaps(int32_t               , NPY_INT      , int)
%numpy_typemaps(uint32_t      , NPY_UINT     , int)
%numpy_typemaps(long              , NPY_LONG     , int)
%numpy_typemaps(unsigned long     , NPY_ULONG    , int)
%numpy_typemaps(int64_t         , NPY_LONGLONG , int)
%numpy_typemaps(uint64_t, NPY_ULONGLONG, int)
%numpy_typemaps(float             , NPY_FLOAT    , int)
%numpy_typemaps(double            , NPY_DOUBLE   , int)
[..]

Интересно, есть ли у кого идея лучше, чем редактировать numpy.i

ура
Jochen

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]