Ganesh Pal schrieb am 29.08.2016 um 19:30: > I need you input on the below hello world program. I a m trying to add a > python binding which will return the character for the given index . I am > on Python 2.7 and linux > > Example : > >>> string ='helloworld' > >>> dda_hello(5) > >>> 'w' > > /* > + * Hello world example for python bindings > + */ > + > +static char* string = "helloworld"; > +char dda_hello(int i) > + { > + return string[i]; > + } > + > +static PyObject * > +py_dda_hello(PyObject *self, PyObject *args ) > +{ > + int index; > + char char1; > + if (!PyArg_ParseTuple(args, "i", &index)) > + return NULL; > + char1 = dda_hello(index); > + return Py_BuildValue("s",char1); > +} > + > +/* > > @@ -1674,6 +1705,10 @@ PyMethodDef xyz_methods[] = { > + {"dda_hello", py_dda_hello, METH_VARARGS, > + "Returns the character entered for a given index"},
Here's a Cython implementation (http://cython.org) of your example: cdef str string = "helloworld" def dda_hello(int i): return string[i] It uses a lot less code than the C-implemented version, but is compatible with Python 2 and Python 3 and avoids pitfalls like the crash you are seeing, as well as raising a proper IndexError for invalid index arguments (and it supports negative indexing). I also wouldn't be surprised if it's visibly faster than your C implementation. Unless your intention is to explicitly learn how to use the CPython C-API, you should give Cython a try instead. Stefan -- https://mail.python.org/mailman/listinfo/python-list