Change in behavior of PyArray_BYTES(
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.c... 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
On Wed, Jul 27, 2011 at 5:35 PM, Matthew Brett <matthew.brett@gmail.com>wrote:
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.c...
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?
Yes, this was an error. Michael Droettboom's pull request to fix it is already merged, so if you update against master it should work. -Mark
Best,
Matthew _______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Hi, On Wed, Jul 27, 2011 at 3:40 PM, Mark Wiebe <mwwiebe@gmail.com> wrote:
On Wed, Jul 27, 2011 at 5:35 PM, Matthew Brett <matthew.brett@gmail.com> wrote:
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.c...
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?
Yes, this was an error. Michael Droettboom's pull request to fix it is already merged, so if you update against master it should work. -Mark
Ah - yes - thanks, Matthew
participants (2)
-
Mark Wiebe
-
Matthew Brett