[Numpy-discussion] PyArray_SETITEM macro ends in semicolon

jason-sage@creativetra... jason-sage@creativetra...
Wed Sep 24 22:25:01 CDT 2008


I'm working on getting the Sage matrices for real/complex doubles to use 
numpy as a backend.  In this, I'm using the PyArray_SETITEM macro from 
within Cython.  However, Cython wraps the macro in a function call to 
convert the output to a Python value:

  __pyx_1 = PyInt_FromLong(PyArray_SETITEM(__pyx_v_self->_matrix_numpy, 
PyArray_GETPTR2(__pyx_v_self->_matrix_numpy, __pyx_v_i, __pyx_v_j), 
__pyx_v_value));

However, after preprocessing, because of the semicolon at the end of the 
SETITEM macro, we get:


PyInt_FromLong(((PyArrayObject 
*)(__pyx_v_self->_matrix_numpy))->descr->f->setitem((PyObject 
*)(__pyx_v_value), (char *)(((void *)((((PyArrayObject 
*)(__pyx_v_self->_matrix_numpy))->data) + (__pyx_v_i)*(((PyArrayObject 
*)(__pyx_v_self->_matrix_numpy))->strides)[0] + 
(__pyx_v_j)*(((PyArrayObject 
*)(__pyx_v_self->_matrix_numpy))->strides)[1]))), (PyArrayObject 
*)(__pyx_v_self->_matrix_numpy)););

Note that at the end, we have a "););".  The file refuses to compile.  
Presumably, since SETITEM returns a value, wrapping the return value in 
a function call seems to be a reasonable thing to do.  Would there be a 
problem in eliminating the semicolon and instead wrapping the entire 
function body in parenthesis?

I noticed that GETITEM also ended in a semicolon, though I didn't have 
the same problem as above since Cython didn't automatically wrap it in a 
function call (I'm not even sure if it returns something).

On a side note, is the above the best way (i.e., fastest way given an 
arbitrary numpy array) to set/get
an element?

Thanks,

Jason



More information about the Numpy-discussion mailing list