On Tue, Jun 30, 2009 at 6:42 PM, Lisandro Dalcin<[email protected]> wrote:
> On Tue, Jun 30, 2009 at 9:26 PM, Ondrej Certik<[email protected]> wrote:
>>
>> However, this assumes some particular form of PyObject_HEAD. Once it
>> changes, my code will segfault.
>>
>
> Indeed. That changes when you use a debug build of Python (./configure
> --with-pydebug).
>
>> So I guess the right way to do this is
>> to write my own C header file with the above struct (e.g. using the
>> PyObject_HEAD macro) and then just reference it using:
>>
>> cdef extern from "Python.h":
>>    ctypedef void PyTypeObject
>>
>> cdef extern from "my_header.h":
>>    ctypedef struct CDataObject:
>>        char *b_ptr
>>
>> which should always work.
>>
>> What do you think?
>>
>
> Provided that ctypes.h is not a public header, I would do exactly the
> same as you...
>
> PS: Can you believe that ctypes, being intended to be a tool for easy
> interoperation with C code, does not provide a public C API in order
> to let third-party codes to take advantage?

Indeed, it doesn't provide it on my Ubuntu. It sucks.

One more question. I am using ctypes because using it I can take a
list of floats and create a C array of it:

(c_float * len(ptr))(*ptr)

from historical reasons (I am adapting some opengl example from
pyglet, that used that approach --- since pyglet uses ctypes to wrap
opengl). I use cython, so I think a better way is to use numpy?

opengl supports strides, but it's just one number, e.g. it has to be
the same for all rows (as opposed to numpy). Is it safe to just copy
the numpy array, to make sure it's contiguous and then just use the
pointer to the .data member of ndarray? That's what I always do, but I
don't know if this is the safe or best approach.

Ondrej
_______________________________________________
Cython-dev mailing list
[email protected]
http://codespeak.net/mailman/listinfo/cython-dev

Reply via email to