Hello together,
we embedded Python 3 in a C++ environment. In this application I created a new class, that is a subclass from numpy array.
Until
now (numpy 1.6 or numpy 1.7 without the deprecation define
(NPY_NO_DEPRECATED_API) the typedef for my class describing the object
was something like
typedef struct
{
PyArrayObject numpyArray;
int myMember1;
int myMember2;
...
} PySubclassObject
This
always worked for me and a call to PyArray_NDIM(obj) returned the
number of dimensions, where obj is of type PySubclassObject*.
If I am now using numpy 1.7 this also works if the line #define NPY_NO_DEPRECATED_API 0x00000007 is not set.
However,
if I removed all deprecated content, there occurrs the first runtime
error when creating an instance of PySubclassObject.
This is due to the fact, that PyArrayObject now only is a tiny typedef of the following form
typedef struct tagPyArrayObject {
PyObject_HEAD
} PyArrayObject;
Previously this has been something like
typedef struct tagPyArrayObject {
PyObject_HEAD
char *data;
int nd;
npy_intp *dimensions;
...
} PyArrayObject;
Usually,
when creating only one np.array, there is extra space allocated
depending on the size of PyArrayObject_fields. However, in my subclass
I don't know how to add that extra space between the members numpyArray and myMember1. Finally, when calling
PyArray_NDIM(obj)
like above, the obj-pointer is casted in the macro to
PyArrayObject_fields*. This yields an access conflict with myMember1,
myMember2...
and the members of PyArrayObject_fields.
I hope this description
was clear enough to understand my problem. Has anybody an idea what I
need to change such that the subclassing also works for the new
numpy structure?
Thanks for any answer.
Cheers
Marc