复杂的用法

让我们将上面的所有例子组合成一个复杂的场景:使用 libclfind 函数。

有关该功能的更多详细信息,请阅读手册页 。我请你在继续之前阅读它。

首先,我们将定义适当的原型:

>>> 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

请注意,xyPOINTER(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