[Numpy-discussion] C Api newbie question

Travis Oliphant oliphant.travis at ieee.org
Sun Aug 27 01:45:43 CDT 2006


Matt Knox wrote:
>
> Hi there. I'm in the unfortunate situation of trying to track down a 
> memory error in someone elses code, and to make matters worse I don't 
> really know jack squat about C programming. The problem seems to arise 
> when several numpy arrays are created from C arrays in the C api and 
> returned to python, and then trying to print out or cast to a string 
> the resulting array. I think the problem may be happening due to the 
> following chunk of code:
> {
>      PyObject* temp = PyArray_SimpleNewFromData(1, &numobjs, typeNum, 
> dbValues);
>      PyObject* temp2 = PyArray_FromArray((PyArrayObject*)temp, 
> ((PyArrayObject*)temp)->descr, DEFAULT_FLAGS | ENSURECOPY);
>      Py_DECREF(temp);
>      PyDict_SetItemString(returnVal, "data", temp2);
>      Py_DECREF(temp2);
> }
>  
> Lets assume that all my other inputs up this point are fine and that 
> numobjs, typeNum, and dbValues are fine. Is their anything obviously 
> wrong with the above chunk of code? or does it appear ok? Ultimately 
> the dictionary "returnVal" is returned by the function this code came 
> from, and everything else is discarded. Any help is very greatly 
> appreciated. Thanks in advance,

You didn't indicate what kind of trouble you are having.

First of all, this is kind of odd style.  Why is a new array created 
from a data-pointer and then copied using PyArray_FromArray (the 
ENSURECOPY flag will give you a copy)?  Using

temp2 = PyArray_Copy(temp)

seems simpler.   This will also avoid the reference-count problem that 
is currently happening in the PyArray_FromArray call on the descr 
structure.    Any array-creation function that takes a descr structure 
"steals" a reference to it, so you need to increment the reference count 
if you are passing an unowned reference to a ->descr structure.

-Travis








More information about the Numpy-discussion mailing list