Ctypes从双指针读取数据

时间:2018-02-15 10:24:46

标签: python pointers return-value ctypes

我正在使用C包装器创建一个C ++ Dll,我正在为将来的用户创建一个Python包装器(我从星期一开始发现ctypes)。我的Dll的一个方法(因为它是一个类)返回一个unsigned short **,调用data,它对应一个图像。在C ++上,我使用data[row][column]得到像素的值。

我在Python中使用以下模型创建了一个函数:

mydll.cMyFunction.argtypes = [c_void_p]
mydll.cMyFunction.restype = POINTER(POINTER(c_ushort))

当我调用此函数时,我有result = <__main__.LP_LP_c_ushort at 0x577fac8> ,当我尝试在此地址查看数据时(使用result.contents.contents),我得到第一个像素的正确值。但我不知道如何访问我的图像的其余部分的值。有没有一种简单的方法可以做一些像C ++(data[i][j])?

1 个答案:

答案 0 :(得分:1)

是的,只需使用result[i][j]即可。这是一个人为的例子:

>>> from ctypes import *
>>> ppus = POINTER(POINTER(c_ushort))
>>> ppus
<class '__main__.LP_LP_c_ushort'>
>>> # This creates an array of pointers to ushort[5] arrays
>>> x=(POINTER(c_ushort)*5)(*[cast((c_ushort*5)(n,n+1,n+2,n+3,n+4),POINTER(c_ushort)) for n in range(0,25,5)])
>>> a = cast(x,ppus) # gets a ushort**
>>> a
<__main__.LP_LP_c_ushort object at 0x00000000026F39C8>
>>> a[0] # deref to get the first ushort[5] array
<__main__.LP_c_ushort object at 0x00000000026F33C8>
>>> a[0][0] # get an item from a row
0
>>> a[0][1]
1
>>>
>>> a[1][0]
5

因此,如果你正确地从C返回ushort **,它应该“正常工作”。