Пытаюсь передать Си-функции указатель на функцию-callback из python. Почему-то не получается разобраться -- вызов callback вылетает с access violation внутри библиотеки.
Код использования ctypes (в body.pointer при вызове self._cdll.NewtonBodySetForceAndTorqueCallback точно правильный указатель -- проверил):
Код | from ctypes import *
# ...
class NewtonBody(Structure): def __init__(self, pointer = 0): self.pointer = pointer
# ...
class Newton: def __init__(self): self._cdll = CDLL('newton.dll') self.world = NewtonWorld()
# ...
# NewtonBodySetForceAndTorqueCallback def bodySetForceAndTorqueCallback(self, body): CALLBACK = CFUNCTYPE(c_int, POINTER(NewtonBody), c_float, c_int) def callback(a, b, c): print '1' return 0 self._cdll.NewtonBodySetForceAndTorqueCallback(body.pointer, CALLBACK(callback)) return None
|
Traceback:
Код | Traceback (most recent call last): File "Newton.py", line 119, in <module> newton.update(10.5) File "Newton.py", line 42, in update self._cdll.NewtonUpdate(self.world.pointer, c_float(timestep)) WindowsError: exception: access violation reading 0x3C888899
|
Тип-указатель на функцию в Си и прототип функции, в которую пытаюсь передать callback:
Код | typedef void (*NewtonApplyForceAndTorque) (const NewtonBody* body, dFloat timestep, int threadIndex);
// ...
NEWTON_API void NewtonBodySetForceAndTorqueCallback (const NewtonBody* body, NewtonApplyForceAndTorque callback);
|
Что может быть не так? |