[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