Вопрос

Кажется, я не могу реализовать offsetof для структуры в ctypes.Я виделЧасто задаваемые вопросы по ctypes, но либо это не работает, либо я не могу понять детали.

Python 2.6.4 (r264:75706, Dec 19 2010, 13:04:47) [C] on sunos5
Type "help", "copyright", "credits" or "license" for more information.
>>> from ctypes import *
>>> class Dog(Structure):
...   _fields_ = [('name', c_char_p), ('weight', c_int)]
...   def offsetof(self, field):
...     return addressof(field) - addressof(self)
... 
>>> d = Dog('max', 80)
>>> d.offsetof(d.weight)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in offsetof
TypeError: invalid type
>>> d.offsetof(weight)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'weight' is not defined
>>> d.offsetof('weight')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in offsetof
TypeError: invalid type

Кажется addressof() не работает с членами структуры (например. d.weight).Я пробовал другие вещи с участием pointer() и byref(), но не повезло.

Конечно, я хочу, чтобы это работало над всеми архитектурами, независимо от размера указателя, и независимо от последствий прокладки, поэтому, пожалуйста, не говорите, чтобы просто суммировать размер () для всех предыдущих элементов, если только вы не можете убедиться, что это Вы принимаете любую прокладку, которую компилятор C добавляет.

Есть идеи?Спасибо!

Это было полезно?

Решение

class Dog(Structure):
    _fields_ = [('name', c_char_p), ('weight', c_int)]

Dog.name.offset
# 0
Dog.weight.offset
# 4 (on my 32-bit system)

Задача превратить это в метод остается за читателем :)

Другие советы

Проблема в том, что элементы структуры иногда возвращаются в виде простых типов Python. Например

class Test(Structure):
    _fields_ = [('f1', c_char), ('f2', c_char * 0)]

type (test (). f1) - тип (test (). f2) - это str

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top