LINUX.ORG.RU

python, ctypes, callbacks


0

0

Пытаюсь передать Си-функции указатель на функцию-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);

Что может быть не так?

★★★
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.