Domanda

Non riesco a implementare offsetof per una struttura in ctypes. Ho visto il FAQ per ctypes , ma o non funziona, o Io non riesco a capire i dettagli.

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

Sembra addressof() non funziona su elementi del dispositivo (ad es d.weight). Ho provato altre cose che coinvolgono pointer() e byref(), ma senza fortuna.

Certo che voglio che questo lavoro su tutte le architetture, a prescindere dalle dimensioni di un puntatore, e indipendentemente dagli effetti di imbottiture, quindi per favore non dire sommare solo il sizeof () per tutti gli elementi precedenti, a meno che non è possibile garantire che si sta prendendo l'imbottitura della C compilatore aggiunge in considerazione.

Tutte le idee? Grazie!

È stato utile?

Soluzione

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

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

Il compito di trasformare questo in un metodo è lasciata al lettore:)

Altri suggerimenti

Il problema è che i membri della struttura sono a volte restituiti come tipi di pitone pianura. Ad esempio

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

Tipo (Test (). F1) è di tipo (Test (). F2) viene str

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top