Cpoying a PyList to a C string array

Sheldon shejo284 at gmail.com
Tue Dec 19 17:48:29 EST 2006


Klaas skrev:

> Sheldon wrote:
> > The code below is a rookie attempt to copy a python list of strings to
> > a string array in C. It works to some extent but results in memory
> > problems when trying to free the C string array. Does anyone know how
> > to do this properly?
>
> You have numerous problems in this code.  The most important problem is
> that you are referring to global variables which appear to be c structs
> but you don't provide the definition (e.g., "work").  However, I can
> guess some of the issues:
>
> >   for (i = 0; i < work.sumscenes; i++) {
> >     msgop = PyList_GetItem(work.msgobj, i);
> >     work.msg_scenes[i] = PyString_AsString(msgop);
> >     ppsop = PyList_GetItem(work.ppsobj, i);
> >     work.pps_scenes[i] = PyString_AsString(ppsop);
> >   }
>
> PyString_AsString returns a pointer to the internal buffer of the
> python string.  If you want to be able to free() it (or indeed have it
> exist for beyond the lifetime of the associated python string), you
> need to malloc() memory and strcpy() the data.  If the strings contain
> binary data, you should be using PyString_AsStringAndSize.  see
> http://docs.python.org/api/stringObjects.html.
>
> I notice that you are doing no error checking or ref counting, but my
> (inexperienced python c programming) opinion is that it should work
> (neither api could potentially call python code, so I don't think
> threading is an issue).
>
> >   for (i = 0; i < NumberOfTiles; i++) {
> >     tileop  = PyList_GetItem(work.tileobj, i);
> >     work.tiles[i] = PyString_AsString(tileop);
> >     sceneop = PyList_GetItem(work.nscenesobj, i);
> >     work.nscenes[i] = PyInt_AsLong(sceneop);
> >   }
> >   return 1;
>
> Similarly.
>
> -Mike

Thanks Mike,

I am rewriting the code but I don't understand the part about the c
struct variable called work. The function I posted is a part of a
larger script and I just posted that part that was problamatic. I was
under the impression that if I declared the structure as global with
the variable in tow:

struct my_struct {
int var;
} work;

then this is visible everywhere in the function as long as everything
is in one file. Did I miss something?

/S




More information about the Python-list mailing list