为什么以下各项不起作用?
import ctypes
class Test(ctypes.Structure):
_fields_ = [("my_pointer", ctypes.POINTER(ctypes.c_int16))]
t = Test()
t.my_pointer = ctypes.addressof(ctypes.c_int16(123))
错误:
TypeError: expected LP_c_short instance, got int
有没有办法生成LP_c_short?还是任何16位指针?
编辑
使用byref代替addressof原因:
TypeError: expected LP_c_short instance, got CArgObject
以这种方式定义Test结构,因为它看起来像C-DLL中的样子。
答案 0 :(得分:2)
使用byref
或pointer
而不是addressof
a = ctypes.c_int16(123)
t.my_pointer(ctypes.byref(a)
尽管名称类似C &
运算符addressof,但返回的是int而不是ctypes指针。
ctypes.addressof(obj)
将内存缓冲区的地址返回为整数。 obj必须是ctypes类型的实例
编辑
这不起作用吗? :
import ctypes
class Test(ctypes.Structure):
_fields_ = [("my_pointer", ctypes.POINTER(ctypes.c_int16))]
t = Test()
cc = ctypes.c_int16(123)
t.my_pointer = ctypes.pointer(cc)
print t.my_pointer[0]
答案 1 :(得分:1)
我不是ctypes
的专家,但是遵循docs,以下对我有用:
import ctypes
PI16 = ctypes.POINTER(ctypes.c_int16)
class Test(ctypes.Structure):
_fields_ = [
("my_pointer", PI16),
]
t = Test()
t.my_pointer = PI16(ctypes.c_int16(123))
print(t.my_pointer[0])
否则,您可以这样做:
t.my_pointer = ctypes.pointer(ctypes.c_int32(123))
前者可以让您做一些奇怪的事情,例如:
PI(ctypes.c_int64(123))[0]
即在不同宽度的整数类型之间强制转换,或更糟糕的是...