Cómo corregir Advertencia: el subíndice array tiene el tipo 'char' [-Wchar-subcripts] [cerrado]

0

Hola, escribo una función para restablecer un Character Array en Atmel studio como se muestra a continuación:

char PacketData[50];
void Reset(){
        for (char i=0; i<=50;i++)
           PacketData[i]='
char PacketData[50];
void Reset(){
        for (char i=0; i<=50;i++)
           PacketData[i]='%pre%';
    };
'; };

Pero siempre obtenga una advertencia cuando compile el programa:

  

El subíndice de la matriz de advertencia tiene el tipo 'char' [-Wchar-subcripts]

¿Alguien sabe cómo elimino esta advertencia?

    
pregunta combo_ci

1 respuesta

3

La advertencia es bastante autoexplicativa. Uno de tus subíndices de matriz es un char.

Específicamente:

for (char i=0 ...
     PacketData[i] = ...

Observe que i , su subíndice de matriz (índice), es un tipo char .

La razón por la que esto es malo es que los caracteres suelen estar firmados inesperadamente, lo que significa que puede terminar con subíndices negativos si no se da cuenta de eso, es decir, si no se dio cuenta de que estaba firmado, en lugar de acceder al índice [128] , estarías accediendo inadvertidamente al índice [-128] .

Debería poder corregir la advertencia simplemente reemplazando char i con unsigned char i si está trabajando en un procesador de 8 bits. Para un procesador de 32 bits, es mejor utilizar un unsigned int ya que será mucho más eficiente.

Alternativamente, dado que su código nunca establece i como negativo, simplemente ignore la advertencia. Sin embargo, asegúrese de comprobar sus condiciones de bucle. Las matrices tienen un índice de 0, lo que significa que una matriz declarada con un tamaño de [50] tiene elementos numerados del 0 al 49. Su bucle for hace i <= 50 , lo que significa que intentará acceder a un índice de elementos no existente 50. Debe cambiar que a i < 50 .

Como una nota al margen, ¿por qué reinventar la rueda?

memset(PacketData, '
for (char i=0 ...
     PacketData[i] = ...
', sizeof(PacketData)/sizeof(PacketData[0]))
    
respondido por el Tom Carpenter

Lea otras preguntas en las etiquetas