[Numpy-discussion] Change in behavior of PyArray_BYTES(
Matthew Brett
matthew.brett at gmail.com
Wed Jul 27 18:35:35 EDT 2011
Hi,
I was trying to compile matplotlib against current trunk, and hit an
error with this line:
char* row0 = PyArray_BYTES(matrix);
https://github.com/matplotlib/matplotlib/blob/master/src/agg_py_transforms.cpp
The error is:
src/agg_py_transforms.cpp:30:26: error: invalid conversion from
‘void*’ to ‘char*’
It turned out that the output type of PyArray_BYTES has changed
between 1.5.1 and current trunk
In 1.5.1, ndarraytypes.h:
#define PyArray_BYTES(obj) (((PyArrayObject *)(obj))->data)
(resulting in a char *, from the char * bytes member of PyArrayObject)
In current trunk we have this:
#define PyArray_BYTES(arr) PyArray_DATA(arr)
ifndef NPY_NO_DEPRECATED_API then this results in:
#define PyArray_DATA(obj) ((void *)(((PyArrayObject_fieldaccess *)(obj))->data))
giving a void *
ifdef NPY_NO_DEPRECATED_API then:
static NPY_INLINE char *
PyArray_DATA(PyArrayObject *arr)
{
return ((PyArrayObject_fieldaccess *)arr)->data;
}
resulting in a char * (for both PyArray_DATA and PyArray_BYTES.
It seems to me that it would be safer to add back this line:
#define PyArray_BYTES(obj) (((PyArrayObject *)(obj))->data)
to ndarraytypes.h , within the ifndef NPY_NO_DEPRECATED_API block, to
maintain compatibility.
Do y'all agree?
Best,
Matthew
More information about the NumPy-Discussion
mailing list