2009-10-09 15 views
8

tengo una estructura Estoy acceso a través de ctypes:Uso de las enumeraciones en ctypes.Structure

struct attrl { 
    char *name; 
    char *resource; 
    char *value; 
    struct attrl *next; 
    enum batch_op op; 
}; 

Hasta ahora tengo código Python como:

# struct attropl 
class attropl(Structure): 
    pass 
attrl._fields_ = [ 
     ("next", POINTER(attropl)), 
     ("name", c_char_p), 
     ("resource", c_char_p), 
     ("value", c_char_p), 

Pero no estoy seguro de qué usar para la enumeración batch_op. ¿Debo simplemente asignarlo a un c_int o?

Respuesta

9

Al menos para GCC enum es simplemente un tipo numérico simple. Puede ser de 8, 16, 32, 64 bits o lo que sea (lo he probado con valores de 64 bits), así como signed o unsigned. Supongo que no puede exceder long long int, pero prácticamente debe verificar el rango de su enum sy elegir algo como c_uint.

Aquí hay un ejemplo. El programa C:

enum batch_op { 
    OP1 = 2, 
    OP2 = 3, 
    OP3 = -1, 
}; 

struct attrl { 
    char *name; 
    struct attrl *next; 
    enum batch_op op; 
}; 

void f(struct attrl *x) { 
    x->op = OP3; 
} 

y el Python uno:

from ctypes import (Structure, c_char_p, c_uint, c_int, 
    POINTER, CDLL) 

class AttrList(Structure): pass 
AttrList._fields_ = [ 
    ('name', c_char_p), 
    ('next', POINTER(AttrList)), 
    ('op', c_int), 
] 

(OP1, OP2, OP3) = (2, 3, -1) 

enum = CDLL('./libenum.so') 
enum.f.argtypes = [POINTER(AttrList)] 
enum.f.restype = None 

a = AttrList(name=None, next=None, op=OP2) 
assert a.op == OP2 
enum.f(a) 
assert a.op == OP3 
4

El uso de c_int o c_uint estaría bien. Alternativamente, hay un recipe in the cookbook para una clase Enumeration.

Cuestiones relacionadas