qshinoの日記

Powershell関係と徒然なこと

Python ctypes POINTER() pointer() byref()

違い

  • POINTER( ctypes型 ) ポインタ型を返す
  • pointer( ctypes instance ) ポインタインスタンスを生成。参照渡しにも利用可能だが、重い処理。
  • bytef( ctypes instance ) パラメータの参照渡し用の軽い処理。参照渡し用のポインタを返す。

from ctypes import *

pclass = POINTER(c_int)
p = pclass(c_int(24))
p.contents = c_int(12)

a = c_int(35)
b = pointer(a)

print( a.value )
# 35

c = c_int(40)
windll.user32.poi( byref(a), pointer(c)  ) 
# それぞれ3, 4がセットされる。
# 参照渡し使用時は機能は同等

print( a.value, c.value )

# 3 4

関数ファクトリ

ia = (c_int * 5 )(5,3,7,99,1)

qsort = libc.qsort
qsort.restype = None


@CFUNCTYPE(c_int, POINTER(c_int), POINTER(c_int)) 
def py_cmp_func(a, b):      
    print("py_cmp_func", a[0], b[0]) 
    return a[0] - b[0]


qsort(ia, len(ia), sizeof(c_int), py_cmp_func)

# py_cmp_func 5 1 
# py_cmp_func 33 99
# py_cmp_func 7 33 
# py_cmp_func 1 7 
# py_cmp_func 5 7