複雜的用法

讓我們將上面的所有例子組合成一個複雜的場景:使用 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