On Mon, Feb 10, 2014 at 10:43 PM, Christopher Jordan-Squire <cjord...@uw.edu > wrote:
> I'm trying to wrap some C code using cython. The C code can take > inputs in two modes: dense inputs and sparse inputs. For dense inputs > the array indexing is naive. I have wrappers for that. In the sparse > case the matrix entries are typically indexed via names. So, for > example, the library documentation includes this as input you could > give: > > struct > { > char* ind; > double val, wght; > } data[] = { {"camera", 15, 2}, {"necklace", 100, 20}, {"vase", 90, 20}, > {"pictures", 60, 30}, {"tv", 40, 40}, {"video", 15, 30}}; > > At the C level, data is passed to the function by directly giving its > address. (i.e. the C function takes as an argument (unsigned long) > data, casting the data pointer to an int) > wow -- that's prone to error! but I"m still not sure which pointer you're talking about -- a pointer to this struct? I'd like to create something similar using record arrays, such as > > np.array([("camera", 15, 2), ("necklace", 100, 20), ... ], > dtype='object,f8,f8'). > > Unfortunately this fails because > (1) In cython I need to determine the address of the first element and > I can't take the address of a an input whose type I don't know (the > exact type will vary on the application, so more or fewer fields may > be in the C struct) > still a bit confused, but if this is types as an array in Cython, you should be abel to do somethign like: &the_array[i] to get the address of the ith element. (2) I don't think a python object type is what I want--I need a char* > representation of the string. (Unfortunately I can't test this because > I haven't solved (1) -- how do you pass a record array around in > cython and/or take its address?) > well, and object type will give you a pointer to a pyobject. If you know for sure that that pyobject is a string object (probably want a bytes object -- you son't want unicode here), then you should be abel to get the address of the underlying char array. But that would require passing something different off to the C code that the address of that element. You could use an unsigned long for that first field, as you are assuming that in the C code anyway but I don't hink there is a way in numpy to set that to a pointer to a char allocated elsewhere -- where would it be allocated? So I would give up on expecting to store the struct directly in numpy array, and rather, put something reasonable (maybe what you have above) in the numpy array, and build the C struct you need from that rather than passing a pointer in directly. -Chris -- Christopher Barker, Ph.D. Oceanographer Emergency Response Division NOAA/NOS/OR&R (206) 526-6959 voice 7600 Sand Point Way NE (206) 526-6329 fax Seattle, WA 98115 (206) 526-6317 main reception chris.bar...@noaa.gov
_______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion