2009-08-04 5 views
2

Ceci est une sorte de suivi de my last question si cela peut vous aider.Comment lire/copier des pointeurs de type ctype dans une classe python?

Je définir quelques structures 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))] 

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

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

Ceci est incorrect. Comme je comprends le problème, les données sont une sorte de pointeur de sorte qu'il n'est pas (vraiment) mappé à 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()?

Répondre

0

Ok je l'ai eu à travailler

code a été

print packet.data.header[0] 

grâce à la 7 personne qui a osé regarder la question

la chaîne Google pour la réponse a été: python ctype déréférencer pointeur 3e coup

+0

J'ai déjà répondu à cette question sur Stackoverflow. – Unknown

1

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

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 "") + ">" 
Questions connexes