ok, further digging...I found that in the C function GetVal...it is crashing where I try to malloc some memory. Note, I have no problems when running this from C..just from Python using my wrapper.
GetVal looks something like.. MY_NUM *GetVal(const char *in, const int x) { MY_NUM *results, *returnResults; results = (MY_NUM *) malloc((x * sizeof(MY_NUM) + 1); returnResults = results; // ..do more work.. return returnResults; } I put in print statements into the C code and found that it is crashing at the line where I malloc some space for "results". ...any ideas why this is crashing when calling from Python via C wrapper? Java and Swing wrote: > Sorry about the double post... > > anyhow, after putting in debug statements I found that it was crashing > when it called, free(result)....so I removed the free(result). > > now it crashes when it gets to, b = GetVal(bString, count(bString, > ",")); > > ..any ideas? > > Java and Swing wrote: > > Antoon, > > I just saw that to. I updated the code like so... > > > > static PyObject *wrap_doStuff(PyObject *self, PyObject *args) { > > // this will store the result in a Python object > > PyObject *finalResult; > > > > // get arguments from Python > > char *result = 0; > > char *in= 0; > > char *aString = 0; > > char *bString = 0; > > MY_NUM *a = (MY_NUM *) PyMem_Malloc((20 * sizeof(MY_NUM) + 1); // > > the array will be 20 long > > MY_NUM *b = (MY_NUM *) PyMem_Malloc((20 * sizeof(MY_NUM) + 1); // > > the array will be 20 long > > int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString); > > if (!ok) return 0; > > > > // do work to get a and b > > // count - returns an int; GetVal - returns a MY_NUM * (a pointer > > to a MY_NUM array) > > a = GetVal(aString, count(aString, ",")); > > b = GetVal(bString, count(bString, ",")); > > > > // make function call, which returns a char * > > result = doStuff(in, a, b); > > > > // save result in Python string > > finalResult = PyString_FromString(result); > > > > // free memory > > PyMem_Free(a); > > PyMem_Free(b); > > free(aString); > > free(bString); > > free(result); > > > > // return the result as a Python string > > return finalResult; > > } > > > > ..as you can see, i malloc'ed memory, and free'd the memory. However, > > I still have python crashing (after only 3 successful calls to > > doStuff). And yes, doStuff is a plain C function...nothing related to > > Python. > > > > > > Antoon Pardon wrote: > > > Op 2005-10-12, Java and Swing schreef <[EMAIL PROTECTED]>: > > > > static PyObject *wrap_doStuff(PyObject *self, PyObject *args) { > > > > // this will store the result in a Python object > > > > PyObject *finalResult; > > > > > > > > // get arguments from Python > > > > char *result = 0; > > > > char *in= 0; > > > > char *aString = 0; > > > > char *bString = 0; > > > > MY_NUM *a; > > > > MY_NUM *b; > > > > int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString); > > > > if (!ok) return 0; > > > > > > > > // do work to get a and b > > > > // count - returns an int; GetVal - returns a char * > > > > a = GetVal(aString, count(aString, ",")); > > > > b = GetVal(bString, count(bString, ",")); > > > > > > > > // make function call, which returns a char * > > > > result = doStuff(in, a, b); > > > > > > > > // save result in Python string > > > > finalResult = PyString_FromString(result); > > > > > > > > // free memory > > > > PyMem_Free(result); > > > > PyMem_Free(a); > > > > PyMem_Free(b); > > > > > > > > // return the result as a Python string > > > > return finalResult; > > > > } > > > > > > > > ...from python I can call this function 4 times...works fine. WHen I > > > > call it for the fifth time python.exe crashes. im thinking some memory > > > > problem in the wrapper function perhaps...but I am not sure. The > > > > actually C function, doStuff can be called 5, 6,7...N times without a > > > > problem > > > > so i know its gotta be my wrapper. > > > > > > > > Any ideas? Thanks! > > > > > > Well assuming your doStuff is a C function that knows nothing of python. > > > it might be the PyMem_Free(result). > > > http://docs.python.org/api/memoryInterface.html says the following: > > > > > > void PyMem_Free(void *p) > > > Frees the memory block pointed to by p, which must have been > > > returned by a previous call to PyMem_Malloc() or PyMem_Realloc(). > > > Otherwise, or if PyMem_Free(p) has been called before, undefined > > > behavior occurs. If p is NULL, no operation is performed. > > > > > > But your result wasn't allocated by a PyMem_Malloc, it was returned > > > to you by a C function. > > > > > > -- > > > Antoon Pardon -- http://mail.python.org/mailman/listinfo/python-list