Python Language Utilisation complexe


Exemple

lfind tous les exemples ci-dessus en un scénario complexe: utiliser la fonction lfind libc .

Pour plus de détails sur la fonction, lisez la page de manuel . Je vous exhorte à le lire avant de continuer.

Tout d'abord, nous définirons les prototypes appropriés:

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

Ensuite, créons les variables:

>>> key = c_int(12)
>>> arr = (c_int * 16)(*range(16))
>>> nmemb = c_uint(16)

Et maintenant, nous définissons la fonction de comparaison:

>>> def compar(x, y):
        return x.contents.value - y.contents.value

Notez que x et y sont POINTER(c_int) , nous devons donc les déréférencer et prendre leurs valeurs afin de comparer la valeur stockée dans la mémoire.

Maintenant, nous pouvons tout combiner:

>>> lfind = lfind_proto(libc.lfind)
>>> ptr = lfind(byref(key), byref(arr), byref(nmemb), sizeof(c_int), compar_proto(compar))

ptr est le pointeur vide retourné. Si la key n'a pas été trouvée dans arr , la valeur serait None , mais dans ce cas, nous avons une valeur valide.

Maintenant, nous pouvons le convertir et accéder à la valeur:

>>> cast(ptr, POINTER(c_int)).contents
c_long(12)

En outre, nous pouvons voir que ptr pointe vers la valeur correcte à l'intérieur d' arr :

>>> addressof(arr) + 12 * sizeof(c_int) == ptr
True