0

我相信基本流程是:

from ctypes import *

LEAP = ctypes.CDLL('leap.dylib')

leap_controller = LEAP.leap_controller
leap_controller.res_type = c_void_p

leap_controller_dispose = LEAP.leap_controller_dispose
leap_controller_dispose.argtype = [c_void_p]

但是,当我调用此代码时,它会破坏 void * 指针。从相关的 C 代码调试,我得到:

doug:test doug$ python test.py
Controller init!
returning: 0x7fcf9a0022c0
Created controller

Controller dispose!
argument: 0xffffffff9a0022c0
Segmentation fault: 11

显然 free() 调用失败是因为指针不正确。

我对此尝试了几种变体,例如,定义一个结构,例如:

class LEAP_CONTROLLER(Structure):
  _fields_ = [
      ("data", c_void_p)
  ]

leap_controller = LEAP.leap_controller
leap_controller.res_type = POINTER(LEAP_CONTROLLER)

leap_controller_dispose = LEAP.leap_controller_dispose
leap_controller_dispose.argtype = [POINTER(LEAP_CONTROLLER)]

...但结果似乎总是一样的。

Python 读取指针,但只保留 32 位数据,并返回一个损坏的指针,其余位全为 1。

这两个二进制文件都是 64 位的:

Non-fat file: /usr/local/bin/python is architecture: x86_64
Non-fat file: ../../dll/libcleap.dylib is architecture: x86_64

我在这里看到了这个古老的问题:http: //bugs.python.org/issue1703286

...但它被标记为已解决。

其他一些随机邮寄此线程似乎提到 ctypes '将 64 位指针截断为 32 位',但人们似乎都神奇地解决了他们的问题而没有做任何事情('它现在可以工作')或没有得到他们的问题的答案.

有人知道我在做什么错吗?

4

1 回答 1

0

根据评论回答;这是我的代码中的一个错字。

 Per the docs, it's argtypes and restype, not argtype and res_type. –  eryksun Oct 4 at 2:31 
于 2013-10-12T11:59:50.690 回答