2009-11-23 15 views
15

mi estructura es un poco como esto¿Hay alguna manera de recorrer una estructura con elementos de diferentes tipos en C?

typedef struct { 
    type1 thing; 
    type2 thing2; 
    ... 
    typeN thingN; 
} my_struct

cómo enumerar niños struct en un bucle tales como tiempo, o para?

+0

qué operación quiere usted hacer a cada uno? –

+0

No puedo ver por qué querría recorrer diferentes tipos. ¿No cada tipo requiere una operación diferente? Por favor explique. –

+0

curiosidad, tengo una función que acepta un valor con el orden de los niños de una sctruct, ejemplo, función ("cadena1", "cadena2", 1 // este es el índice de hijos de struct) en el cuerpo de la función, Lo sé, donde voy a mantener los parámetros de las cadenas, sé que puedo pasar el puntero a los niños que quiero, pero, creo que esa era otra forma. gracias por todas las respuestas – drigoSkalWalker

Respuesta

34

no estoy seguro de lo que quiere lograr, pero se puede utilizar X-Macros y tienen el preprocesador hacer la iteración sobre todos los campos de una estructura:

//--- first describe the structure, the fields, their types and how to print them 
#define X_FIELDS \ 
    X(int, field1, "%d") \ 
    X(int, field2, "%d") \ 
    X(char, field3, "%c") \ 
    X(char *, field4, "%s") 

//--- define the structure, the X macro will be expanded once per field 
typedef struct { 
#define X(type, name, format) type name; 
    X_FIELDS 
#undef X 
} mystruct; 

void iterate(mystruct *aStruct) 
{ 
//--- "iterate" over all the fields of the structure 
#define X(type, name, format) \ 
     printf("mystruct.%s is "format"\n", #name, aStruct->name); 
X_FIELDS 
#undef X 
} 

//--- demonstrate 
int main(int ac, char**av) 
{ 
    mystruct a = { 0, 1, 'a', "hello"}; 
    iterate(&a); 
    return 0; 
} 

Esto imprimirá:

mystruct.field1 is 0 
mystruct.field2 is 1 
mystruct.field3 is a 
mystruct.field4 is hello 

también puede añadir el nombre de la función que se invoca en el x_fields ...

+3

gracias por presentarme a X-Macro, ¡excelente respuesta! – drigoSkalWalker

+3

X-Macro fue una revelación para mí. Se siente un poco sucio, pero un poco correcto. ¡Gracias! – KarateSnowMachine

3

No hay una manera segura de enumerar los miembros de una estructura, a menos que se conozca el contenido exacto de la estructura, e incluso en ese caso hay que tener cuidado con cosas como struct alignment/padding.

Dependiendo de su problema, podría ser más seguro tener una matriz de su estructura.

0

Dado que planea manejarlos en un bucle, supongo que los diferentes tipos pueden al menos tratarse igual o tener tamaños similares.

Si este es el caso, su elección dependerá del tamaño de los elementos. Si son todos iguales, puede recuperar un puntero a la estructura, convertirlo en uno de sus tipos e incrementarlo hasta que 'agote' toda la estructura.

PD: De hecho, no es una práctica muy segura. Esta situación se manejó mucho mejor con un enfoque OO, aprovechando el polimorfismo. De lo contrario, no hay garantías sobre la alineación como se mencionó anteriormente.

0

No hay forma de iterar a través de los miembros de la estructura en el lenguaje C, independientemente de si tienen el mismo tamaño/tipo o diferentes tamaños/tipos.

+0

Hmm, si todos fueran del mismo tipo, ¿no sería capaz de usar un poco de aritmética 'sizeof' y recorrer los valores? Estoy de acuerdo en que no es real contar un mapeo significativo de esos valores sin conocer el orden de las declaraciones de antemano, pero creo que podría iterar sobre los valores como un conjunto. –

Cuestiones relacionadas