On Mon, 7 Feb 2005, Viktor Hornak wrote:
> I've been trying to find more resources/documentation about how to > convert python lists to C arrays (and vice versa) when writing a python > extension. Hi Viktor, There was a post back in 1999 that might be useful for you: http://mail.python.org/pipermail/tutor/1999-November/000758.html I'm not positive if there is a nicer helper function to do this. > I also found one or two examples of similar operations on this list > postings (from 6 years ago!) but they didn't quite explain all I need > to know. Ah, so you did see that posting then. *grin* Ok, good. What parts of their explanation were incomplete? Maybe one of us here can help fill in more details for you. > Here is the code I was trying to use to convert two lists (one > is a list of strings with the same length and the other is a list of > doubles) to C arrays in a C extension: [Some code cut] The code there seems sorta ok: you might want to add a string length check in there somewhere: the code expects that names are at most 4 characters long, but that condition isn't being checked by strcpy(). > Then I call the function "parseMask" (which I am trying to wrap in this > extension) which returns a C array (integer array, elements are either 0 > or 1). Now I need to convert this integer array to python list and > return it back to python. Here is the code for that: > > result = (int *) malloc(sizeof(int) * nat); > parseMask(...) -> returns int array result > > pylist = PyTuple_New(nat); > for (i = 0; i < nat; i++) { > /* convert resulting array [0/1] to PyObject */ > if (result[i] == 0) > item = PyInt_FromLong(0); > else > item = PyInt_FromLong(1); > > PyTuple_SetItem(pylist, i, item); > Py_DECREF(item); /** <-- (dyoo): bug located */ > } Ah! Got it. Don't call Py_DECREF() here: PyTuple_SetItem will already "steal" the reference, according to the documentation: http://docs.python.org/api/tupleObjects.html#l2h-576 so there's no need to decrement the reference count here. By the way, if you're really going to do more C extension stuff, take a look at Pyrex or SWIG: http://nz.cosc.canterbury.ac.nz/~greg/python/Pyrex/ http://www.swig.org/ Coding C wrappers by hand is painful: use these tools to make your life easier. *grin* Best of wishes! _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor