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
_______________________________________________
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion

Reply via email to