2015-12-16 2 views
3

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

К сожалению, функции 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; 
} 

ответ

1

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

Я редактировал 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

Cheers Jochen

+0

Whoa +1. Я думаю, что правильное решение - подать отчет об ошибке, но я не знаю, упадет ли он на ловкие уши. я на самом деле в конечном итоге с помощью '' ' % применяются (неподписанные символ * IN_ARRAY1, внутр DIM1) {(uint8_t * buff_ptr, внутр buff_size)} ' '' – user87746