[GRASS-user] Question with Python-SWIG example [SEC=UNCLASSIFIED]
Glynn Clements
glynn at gclements.plus.com
Wed Apr 21 14:57:38 EDT 2010
Andrew MacIntyre wrote:
> > > After some googling, it seems that the pointer address should be
> > > obtainable by using int() on the pointer object returned by the SWIG
> > > wrapper (i.e. int(p) in the above example), with the resulting value
> > > usable in ctypes' from_address() method. I might be wrong, but I
> > > think that e.g. ctypes.c_void_p(int(p)) might also work to create a
> > > ctypes void pointer instance.
> >
> > That doesn't seem to work either:
> >
> > > import grass.lib.grass as gis
> > > import grass.lib.raster as rast
> > > import ctypes
> > > gis.G_gisinit("")
> > > p = rast.Rast_allocate_c_buf()
> > > a = ctypes.cast(int(p), ctypes.POINTER(ctypes.c_int))
> > > infd = rast.Rast_open_old("elevation.dem", "")
> > > rast.Rast_get_c_row(infd, a, 10)
>
> I think the above line should read:
>
> rast. Rast_get_c_row(infd, p, 10)
That was what I tried first, but it results in Rast_get_c_row()
segfaulting.
There is a typemap for pointers, which converts a CObject, string,
buffer or sequence. I have no idea how to test for or convert a
SWIG-wrapped pointer.
The fact that passing "a" doesn't segfault appears to indicate that it
was successfully converted to a pointer. The fact that accessing a[0]
afterwards leads me to suspect that it may be getting converted to a
pointer to the "container" rather than to the array proper.
--
Glynn Clements <glynn at gclements.plus.com>
More information about the grass-user
mailing list