2012-10-08 19 views
5

tengo una para hacer frente a una estructura de un lib:C y gcc formación de error subíndice se delimita por encima de gama

typedef struct { 
    uint8_t response_type; 
    uint8_t error_code; 
    uint16_t sequence; 
    uint32_t resource_id; 
    uint16_t minor_code; 
    uint8_t major_code; 
    uint8_t pad0; 
    uint32_t pad[5]; 
    uint32_t full_sequence; 
} a_structure; 

mi problema viene de la almohadilla [5] miembro de la estructura que no lo hago realmente entiendo I thougth a este miembro puede ser utilizado como el otro miembro de la función así:

uint8_t get_response_type(a_structure * my_struct) 
{ 
    return my_struct->response_type; 
} 

pero esta función:

uint32_t get_pad_5(a_structure * my_struct) 
{ 
    return my_struct->pad[5]; 
} 

generan calentamiento en gcc

error subíndice de matriz está por encima límites de matriz

¿Alguien puede explicar ¿Qué significa esto?

Thxs

+0

que tenía un código bastante convolución que gcc logró averiguar y advirtió "formación de error subíndice está por encima de límites de matriz Así que, aunque este problema puesto era obvio, la búsqueda de este. (debido a la advertencia de coincidencia publicada) ayudé a resolver mi problema más complejo. – chux

Respuesta

6

El campo de estructura pad se definió como "matriz de 5 uint32_t". Debe diferenciar la definición de variable del uso de la variable. Por lo tanto, dado que se define pad, pad[5] significa "obtener el quinto (contando desde 0) elemento de la matriz pad". Pero no existe ese elemento en la matriz pad, porque el índice más alto disponible para esta matriz es 4.

Además, parece que desea devolver el puntero al primer elemento de esta matriz, no al quinto elemento. Por lo que debe reescribir su función de esta manera:

uint32_t * get_pad_5(a_structure * my_struct) 
{ 
    return my_struct->pad; 
} 
+0

¿De qué concluyes que el OP está interesado en el 1er elemento? – alk

+1

@alk OP quiere tratar con "miembro del panel [5]". Ése es él no entiende ni indexación de matriz (no hay quinto elemento en la matriz 'pad') o matriz/definición de puntero/usando (miembro de estructura es' pad', no 'pad [5]'). Y también creo que la segundo problema hace mucha más confusión para un novato. – ThomasMore

5

Al crear una nueva matriz con 5 miembros, que la indexación 0-4, si se intenta acces 5, que está fuera de los límites

1

Un conjunto de 5 elementos tiene índices 0 , 1, 2, 3 y 4. El índice 5 está fuera de límites. En general, una matriz de N elementos tiene índices válidos desde 0 hasta N-1 inclusive.

2

Las matrices en C se basan en cero.

my_struct->pad[0]; // the first pad 
my_struct->pad[4]; // the fifth pad 

La advertencia significa que está intentando acceder a un elemento fuera de la matriz. Un índice de 5 significa el sexto elemento y la matriz solo tiene 5 elementos.