Re: [ctypes-users] Pb with a setUserData / getUserData C fonction... (void* userData)
Brought to you by:
theller
From: Lenard L. <le...@te...> - 2007-09-19 15:31:14
|
Woody Grochulski wrote: > I m trying to use a C function that allow to associate a custom object > to the C dll. > The C dll then store and give back the object later on. > > in C the signature is : > > > To set the user data > NEWTON_API void NewtonWorldSetUserData (const NewtonWorld* > newtonWorld, void* userData); > > To get the user data > NEWTON_API void* NewtonWorldGetUserData (const NewtonWorld* newtonWorld); > > I would like to store either a Int either a string either a > dictionnary as user data. > > For the string i tried: > self.newton.NewtonBodySetUserData > (self.rigidBodyBox,create_string_buffer("render\box.egg")) > print c_char_p(self.newton.NewtonBodyGetUserData(self.rigidBodyBox)).value > but if i remplace "render\box_egg" by a var like > name="render\box.egg" it does not workanymore. > > For the int i tried > c_id=c_int(1066) > self.newton.NewtonBodySetUserData (self.rigidBodyBox,byref(c_id)) > print c_int(self.newton.NewtonBodyGetUserData(self.rigidBodyBox))) > but it gives back a location , not the number. > > For the dictionnary, i have no clue. > > I think i did not understand how to use this kind of C functions from > ctypes. This becomes complicated since it overrides Python's memory management. If NewtonWorld only saves a pointer to an object then I suggest the following. Save the Python object in a dictionary keyed by id() and pass the key as the void pointer: newton_user_data = {} def set_newton_user_data(world, data): key = id(data) new_user_data[key] = data NewtonBodySetUserData(world, key) def get_newton_user_data(world): return newton_user_data[NewtonBodyGetUserData(world)] If you are using a 64 bit machine then declare the arguments and return types for the Newton Body functions since a C integer is no longer the same size as a pointer. -- Lenard Lindstrom <le...@te...> |