[Numpy-tickets] [NumPy] #918: SETITEM and GETITEM macros end with semicolons

NumPy numpy-tickets@scipy....
Thu Sep 25 00:57:04 CDT 2008


#918: SETITEM and GETITEM macros end with semicolons
------------------------+---------------------------------------------------
 Reporter:  jason       |       Owner:  somebody
     Type:  defect      |      Status:  new     
 Priority:  normal      |   Milestone:  1.2.0   
Component:  numpy.core  |     Version:  1.1     
 Severity:  major       |    Keywords:          
------------------------+---------------------------------------------------
 The macros PyArray_SETITEM (and PyArray_GETITEM) in ndarrayobject.h end in
 semicolons, which causes problems as detailed below.  Can we remove the
 semicolon, but wrap the entire macro body in parentheses?  Are there other
 macros that end in semicolons that shouldn't?

 (In the email below, the replies are from Chuck Harris)
 {{{
 On Wed, Sep 24, 2008 at 9:25 PM, <jason-sage@creativetrax.com> wrote:

     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:


 Hmm, not good. IMHO, macros should be ended with semicolons *when used*,
 not in themselves.




     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?


 We should do this if possible. Open a ticket.



     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?


 Don't know.

 Chuck
 }}}

-- 
Ticket URL: <http://scipy.org/scipy/numpy/ticket/918>
NumPy <http://projects.scipy.org/scipy/numpy>
The fundamental package needed for scientific computing with Python.


More information about the Numpy-tickets mailing list