复杂的用法
让我们将上面的所有例子组合成一个复杂的场景:使用 libc
的 lfind
函数。
有关该功能的更多详细信息,请阅读手册页 。我请你在继续之前阅读它。
首先,我们将定义适当的原型:
>>> compar_proto = CFUNCTYPE(c_int, POINTER(c_int), POINTER(c_int))
>>> lfind_proto = CFUNCTYPE(c_void_p, c_void_p, c_void_p, POINTER(c_uint), c_uint, compar_proto)
然后,让我们创建变量:
>>> key = c_int(12)
>>> arr = (c_int * 16)(*range(16))
>>> nmemb = c_uint(16)
现在我们定义比较函数:
>>> def compar(x, y):
return x.contents.value - y.contents.value
请注意,x
和 y
是 POINTER(c_int)
,因此我们需要取消引用它们并获取它们的值,以便实际比较存储在内存中的值。
现在我们可以把所有东西组合在
>>> lfind = lfind_proto(libc.lfind)
>>> ptr = lfind(byref(key), byref(arr), byref(nmemb), sizeof(c_int), compar_proto(compar))
ptr
是返回的 void 指针。如果在 arr
中找不到 key
,则值为 None
,但在这种情况下,我们得到一个有效值。
现在我们可以转换它并访问值:
>>> cast(ptr, POINTER(c_int)).contents
c_long(12)
另外,我们可以看到 ptr
指向 arr
内的正确值:
>>> addressof(arr) + 12 * sizeof(c_int) == ptr
True