[capi-sig] Extension Problem

Campbell Barton cbarton at metavr.com
Wed Aug 15 00:32:17 CEST 2007


Hi, as mentioned before, the pointers the issue here,

Some other things you might want to consider. there more of a style thing ;)

static PyObject *cmat_eigv(PyObject *self, PyObject *value)
{
  double min_eps = PyFloat_AsDouble(value);
  if (min_eps==-1 && PyErr_Occurred())
   return NULL;
  return PyInt_FromLong((long)eigenvect_calc(min_eps));
  }
static PyMethodDef cmat_methods[]=
{
  { "eigenvect", cmat_eigv, METH_O, "Comment"},{NULL, NULL, 0, NULL}
  };

notice that Iv replaced METH_VARARGS with METH_O, this means the 
function only accepts 1 arg and you can use that as a float without 
using PyArg_ParseTuple - This should be a bit faster too.

PyFloat_AsDouble will convert from ints or other non float types that 
support the PyNumber protocol.

I can see why this isnt used for an example because its much less generic.

Ali Alhakim wrote:
> Hello!
>  
> I'm quite new to Python and definitely a beginner in implementing Python
> extensions in C/C++. I've followed the structure given in the formal Python
> documentation to write the following code block:
> ===========
> //cmatmod.c
>  
> #include 
>  
> static unsigned int eigenvect_calc(double *min_eps)
> {
>  return 5;
> }
>  
> static PyObject *cmat_eigv(PyObject *self, PyObject *args)
> {
>  double *min_eps;
>  unsigned int m;
>  if(!PyArg_ParseTuple(args, "d", &min_eps))
>   return NULL;
>  m=eigenvect_calc(min_eps);
>  return Py_BuildValue("I", m);
>  }
> static PyMethodDef cmat_methods[]=
> {
>  { "eigenvect", cmat_eigv, METH_VARARGS, "Comment"},{NULL, NULL, 0, NULL}
>  };
>  
> void initcmat(void)
> {
>   (void) Py_InitModule("cmat", cmat_methods);
>  }
>  
> ===========
>  
> I have succeeded to build and install this extension using disutils package
> in the setup.py file below:
> ===========
> from distutils.core import setup
> from distutils.extension import Extension
> setup(name='eigenvect',
>       version='1.0',
>       ext_modules=[Extension('cmat', ['cmatmod.c'])],
>       )
>  
> ==========
> But when I try to call eigenvect(3.0) from Python I would receive a core
> dump:
> ==========
>  
>  6 [main] python 2336 _cygtls::handle_exceptions: Error while dumping state
>  (probably corrupted stack)
> Segmentation fault (core dumped)
>  
> ==========
> My question is what is wrong with the extension code above? Is it something
> with reference counting?
> I don't know which method is suitable for debugging extension codes. I've
> tried gdb but I didn't understand the debug information:
> ==========
>  
> (gdb) >>> eigenvect(4.0)
>  
> Program received signal SIGSEGV, Segmentation fault.
> ---Type  to continue, or q  to quit---
> 0x6abb248e in libpython2!PyEval_EvalFrameEx () from
> /usr/bin/libpython2.5dll
> (gdb)
>  
> ==========
> /best regards
>  
> 
> 
> 
> 
> 
> 
> 
>  
> 
> 
>  
> 
> Gå in och titta på nätets roligaste filmer just nu eller ladda upp ditt eget bidrag på Spray Crazy. http://crazy.spray.se/
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> capi-sig mailing list
> capi-sig at python.org
> http://mail.python.org/mailman/listinfo/capi-sig


-- 
Campbell J Barton (ideasman42)


More information about the capi-sig mailing list