Question

C’est une sorte de suivi de ma dernière question si cela peut vous aider .

Je définis quelques structures de type ctype

class EthercatDatagram(Structure):
    _fields_ = [("header", EthercatDatagramHeader),
                ("packet_data_length", c_int),
                ("packet_data", POINTER(c_ubyte)),
                ("work_count", c_ushort)]

class EthercatPacket(Structure):
    _fields_ = [("ether_header", ETH_HEADER),
                ("Ethercat_header", EthercatHeader),
                ("data", POINTER(EthercatDatagram))]

notez que ceci est correctement analysé par python, les classes manquantes sont définies ailleurs. Mon problème est quand j'appelle le code suivant

packet = EthercatPacket()
ethercap.RecvPacket(byref(packet))
print packet.data.header

Ceci est incorrect. Si j'ai bien compris le problème, les données sont une sorte de pointeur et ne sont donc pas (vraiment) mappées sur EthercatDatagram. Par conséquent, l'analyseur ne connaît pas le champ d'en-tête sous-jacent.

Y at-il un moyen de lire ce champ ainsi que tout autre champ représenté par POINTER ()?

Était-ce utile?

La solution 2

Ok je l'ai fait travailler

le code correct était

print packet.data.header[0]

merci à la personne qui a osé regarder la question

la chaîne Google pour la réponse était: pointeur de déréférence python ctype 3ème coup

Autres conseils

La notation entre crochets est en effet correcte. Pour référence, voici un extrait de code de ctypes que j'ai récemment créé:

class Message(Structure):
    _fields_ = [ ("id", BYTE), ("data", POINTER(BYTE)), ("data_length", DWORD) ]
    def __repr__(self):
        d = ' '.join(["0x%02X" % self.data[i] for i in range(self.data_length)])
        return "<Message: id = 0x%02X, " % (self.id) + "data_length = " + str(self.data_length) + (self.data_length > 0 and (", data: " + d) or "") + ">"
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top