通过Ctypes来给C语言传递回调函数

C语言中有些函数需要制定一些回调函数,在调用函数时需要传递函数指针过去。

函数指针类型创建的方法如下

CFUNCTYPE(返回值类型,参数类型...)

下面是一个示例

CMPFUNC = CFUNCTYPE(c_int,c_int,POINTER(c_int))
def py_cmp_func(a,b):
    print("py_cmp_func",a,b)
    return 0
cmp_func = CMPFUNC(py_cmp_func)

我们通过ctypes传递回调函数给C库函数qsort进行快速排序(windows平台)

void qsort(void base, size_t nitems,size_t size, int(compar)(const void,const void))

testctypesqsort.py

print("Test Ctypees qsort function callback")
from ctypes import *

lib = cdll.msvcrt
# 快速排序比较函数
CMPFUNC = CFUNCTYPE(c_int, POINTER(c_int),POINTER(c_int))
# 比较函数判断大小
def cmp_callback(a, b):
    # a 指向c_int
    return a.contents.value - b.contents.value

cmpfunc =     CMPFUNC(cmp_callback)
qsort = lib.qsort

# 排序的数据 整型列表
data = (c_int * 5)(5, 1, 7, 33, 99)
for i in data:
    print(i ,end = " ")

print("\n开始排序")
qsort(data, len(data), sizeof(c_int), cmpfunc)

for i in data:
    print(i ,end = " ")

运行结果如下

Test Ctypees qsort function callback
5 1 7 33 99
开始排序
1 5 7 33 99
© liangqi all right reserved,powered by Gitbook文件修订时间: 2019-06-01

results matching ""

    No results matching ""