Доступ к 16-битному указателю с помощью ctypes - PullRequest
0 голосов
/ 04 февраля 2019

Почему не работает следующее?

import ctypes

class Test(ctypes.Structure):
    _fields_ = [("my_pointer", ctypes.POINTER(ctypes.c_int16))]

t = Test()
t.my_pointer = ctypes.addressof(ctypes.c_int16(123))

Ошибка: TypeError: expected LP_c_short instance, got int Есть ли способ создать LP_c_short?Или любой 16-битный указатель?

EDIT

Использование byref вместо addressof вызывает: TypeError: expected LP_c_short instance, got CArgObject

Структура теста определяется таким образом, потому чтоэто похоже на C-DLL.

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Используйте byref или pointer, а не addressof

a = ctypes.c_int16(123)
t.my_pointer(ctypes.byref(a)

Несмотря на наличие имени, подобного оператору C &, addressof возвращает int, а не указатель ctypes.

ctypes.addressof (obj)

Возвращает адрес буфера памяти в виде целого числа.obj должен быть экземпляром типа ctypes

EDIT

Это не работает?:

import ctypes

class Test(ctypes.Structure):
    _fields_ = [("my_pointer", ctypes.POINTER(ctypes.c_int16))]

t = Test()

cc = ctypes.c_int16(123)
t.my_pointer = ctypes.pointer(cc)

print t.my_pointer[0]
0 голосов
/ 04 февраля 2019

Я не эксперт по ctypes, но, следуя документам , у меня работает следующее:

import ctypes

PI16 = ctypes.POINTER(ctypes.c_int16)

class Test(ctypes.Structure):
    _fields_ = [
        ("my_pointer", PI16),
    ]

t = Test()
t.my_pointer = PI16(ctypes.c_int16(123))
print(t.my_pointer[0])

в противном случае вы можете сделать:

t.my_pointer = ctypes.pointer(ctypes.c_int32(123))

первый позволит вам делать странные вещи, такие как:

PI(ctypes.c_int64(123))[0]

Т.е. приведение между целочисленными типами разной ширины или, что еще хуже ...

...