From: garyr <ga...@fi...> - 2015-06-01 20:02:02
|
I'm trying to write a wrapper for some C++ code. One of the functions has the form: int SSound::outWrite(int numSamples, double *datap) To invoke this function from Python as ss.outWrite(data) a typemap is required. Following the examples in the SWIG documentation I came up with this: %typemap(in) (self, int arg2, double *datap) { if (PySequence_Check($input)) { int i; $1 = PySequence_Length($input); $2 = (double *)malloc(($1+1)*sizeof(double)); for (i = 0; i < $1; i++) { PyObject *o = PySequence_GetItem($input, i); if (PyDouble_Check(o)) $2[i] = PyDouble_AsDouble(PySequence_GetItem($input, i)); else { PyErr_SetString(PyExc_TypeError, "arg1 must contain doubles"); free($2); return NULL; } } $2[i] = 0; } else { PyErr_SetString)PyExc_TypeError, "not a sequence"); return NULL; } } %typemap(freearg) (self, int arg2, double * datap) { free((char *) $2); } which results in this: Traceback (most recent call last): File "testSSound.py", line 17, in <module> rc = ss.outWrite(dat) TypeError: outWrite() takes exactly 3 arguments (2 given) I also tried it with the "self" in the typemap statement removed and got the same results. What is wrong with the typemap? Also, why is the length of the allocated memory $1+1 instead of just $1? |