2017-10-12 5 views
0

Le c-tête ci-dessousComment faire pour convertir l'en-tête C en code Python ctypes?

typedef struct _node_t { 
int value; 
struct _node_t* next; 
} node_t; 

peut être traduit comme ci-dessous.

class node_t(Structure): 
    pass 

node_t._fields_ = [ 
     ('value', ctypes.c_int), 
     ('next', POINTER(node_t)) 
] 

Cependant, je ne peux pas traduire les codes d'en-tête c avec des fonctions d'annulation et de rappel. Comment est-ce que je devrais traduire ci-dessous le c-header au code de c-types de Python?

class PacketHandlerDelegate_D(Structure): 
pass 

PacketHandlerDelegate_D._fields_ = [ 
    // Delegate object 
    void *delegate; 

    // Callback functions 
    void (*addSampleToA)(void *delegate, int sample1, int sample2); 
    void (*addSampleToB)(void *delegate, unsigned short int signalfast, unsigned short int signalSlow); 
    void (*addSampleToC)(void *delegate, char x, char y, char z); 
    void (*addSampleToD)(void *delegate, unsigned short int sample); 
    void (*addSampleToE)(void *delegate, short int sample); 

]

Répondre

0

lecture de la documentation, les types de pointeurs de fonction peuvent être générés par CFUNCTYPE. Le type de retour void est signalé par None. c_void_p peut être utilisé pour un pointeur vide.

Ainsi, par exemple:

ADD_SAMPLE_TO_B_TYPE = CFUNCTYPE(None, c_void_p, c_ushort, c_ushort) 

... 

PacketHandlerDelegate_D._fields_ = [ 
    ... 
    (addSampleToB, ADD_SAMPLE_TO_B_TYPE), 
    ... 
] 

post-scriptum puisque vous n'avez pas de déclaration récursive dans PacketHandlerDelegate_D, vous pouvez les définir dans le corps de la classe:

class PacketHandlerDelegate_D(Structure): 
    ... 
    addSampleToB = ADD_SAMPLE_TO_B_TYPE 
    ...