Re: [ctypes-users] How do I create a reference to array member
Brought to you by:
theller
From: Tibor H. <ti...@cs...> - 2008-02-19 23:18:23
|
James Dominy wrote: > Tibor Horvath wrote: >> James Dominy wrote: >>> >>> import ctypes >>> >>> array_type = ctypes.c_double*10 >>> >>> a = array_type() >>> >>> type(a[0]) >>> <type 'float'> >>> >>> ctypes.byref(a[0]) >>> Traceback (most recent call last): >>> File "<stdin>", line 1, in ? >>> TypeError: byref() argument must be a ctypes instance, not 'float' >>> >>> >> >> What do you need the address for? You can obtain it with: >> addressof(a)+i*8 > > Thanks, this does the trick. A bit of a mission though :( In answer to > your question. I have a callback function that calls a C function. The > callback function is passed an array of doubles, and the called C > function acts on one of the doubles in the array, by reference. I could > copy the value of the element into a temporary ctypes.c_double instancs, > use byref, and copy back into the original array, but ... well it's a > bit more of a mission ;) Yes, it would be nice if this was simpler to achieve. But again, there might be a neat trick I'm unaware of. You could, for example, try subclassing c_double, which prevents the automatic conversion. The following simple test indicates it would work: >>> from ctypes import * >>> class d(c_double): ... pass ... >>> t = d * 10 >>> a = t() >>> type(a[0]) <class '__main__.d'> >>> for i in range(10): a[i] = i ... >>> byref(a[4]) <cparam 'P' (081a1af8)> >>> p = pointer(a[4]) >>> p <ctypes.LP_d object at 0xb7d96584> >>> p[0] <d object at 0xb7d965cc> >>> p[0].value 4.0 I'm guessing the subclassing can cause some inconvenience though. > My ultimate question remains though... Why is an element of an array of > doubles of type float? From http://docs.python.org/lib/ctypes-fundamental-data-types.html : "Fundamental data types, when returned as foreign function call results, or, for example, by retrieving structure field members or array items, are transparently converted to native Python types." Then remember that Python doesn't have a distinct "double" type, just float. Look at http://docs.python.org/lib/typesnumeric.html : "Floating point numbers are implemented using double in C." Tibor -- Tibor Horvath Graduate Student, Computer Science University of Virginia http://www.cs.virginia.edu/~th8k/ |