Help with chaos math extensions.
Fredrik Lundh
fredrik at pythonware.com
Wed Oct 5 09:16:50 EDT 2005
Brandon K" wrote:
> Here's the Script it was being used in (forgive it if it seems a bit
> messy, i have been tinkering with variables and such to try different
> ideas and haven't really cleaned it up).
the C compiler does in fact provide you with some clues:
c:\test\c_lib.cpp(22) : warning C4700: local variable 'c' used without having been initialized
here's the culprit:
Py_complex *c;
Complex* cplx;
if(!PyArg_ParseTuple(args,"D",c)) return NULL;
PyArg_ParseTuple expects a pointer to a Py_complex object, but you're
passing in an initialized pointer. this works better:
Py_complex c;
Complex* cplx;
if(!PyArg_ParseTuple(args,"D",&c))
return NULL;
cplx = new Complex(&c);
return Py_BuildValue("D",cplx->toOld());
here's the next warning:
c:\test\complex.cpp(50) : warning C4700: local variable 'c' used without having been initialized
this is your toOld function, which has a similar problem:
Py_complex* Complex::toOld(void)
{
Py_complex* c;
c->real = this->real;
c->imag = this->imag;
return c;
}
since c isn't initialized, you'll overwrite some random memory locations when
you assign things to it. here's a brute-force hack:
Py_complex* Complex::toOld(void)
{
static Py_complex c;
c.real = this->real;
c.imag = this->imag;
return &c;
}
here's a better fix:
Py_complex Complex::toOld(void)
{
Py_complex c;
c.real = this->real;
c.imag = this->imag;
return c;
}
which requires you to change
return Py_BuildValue("D",cplx->toOld());
to
return Py_BuildValue("D",&cplx->toOld());
I only got this far before I ran out of time; there might be more bugs in there.
</F>
More information about the Python-list
mailing list