Manipulando arreglo de char

Hola, ante todo no te dará errores de compilación si haces Serial.print(data_input[5]); pero no te estará imprimiendo la parte de memoria de data_input sino otra zona de memoria. Esto cuando imprimes, aunque esté mal, no es peligroso pero si haces data_input[5]='a'; esto destruirá alguna otra variable, colgará el microprocesador, reinicio u otra clase de problema de difícil detección.

Ahora vamos al porqué te está pasando eso:
Cuando trabajamos con cadenas y Serial.print (o cualquier otra función) sabe dónde empieza la cadena dado que le dices "data_input" y esto manda la dirección de memoria donde se ubica la variable data_input pero no sabe dónde acaba la cadena de caracteres. ¿cómo funciona entonces? pues todas las cadenas de estilo lenguaje C deben acabar con un caracter nulo (cero en decimal, en el lenguaje C para Arduino se puede usar '\0').
Para empezar y que lo entindas haz estos pasos:

  • Cambia el tamaño de data_input de 4 a 5 para que pueda albergar un caracter nulo detrás.
  • Si siempre recibes 4 caracteres, antes de imprimir puedes hacer esto: data_input[4]='\0'; y así decimos donde está el final de la cadena.
  • Tendiendo en cuenta todo esto, recuerda que el bucle no debe llegar a sizeof() por lo del carácter nulo sino al sizeof()-1

Ojo, si te fijas he puesto data_input[4] y no data_input[5] dado que los arrays siempre empiezan por cero. si tu defines char data_input[4]; tendrás data_input[0] al data_input[3] incluidos pero NO data_input[4] aunque no te de error. Si te fijas en el bucle tienes for(byte x = 0; que está bien pero recuerda que arrays empiezan por [0].

Recuerda que:

 char hola[]="HOLA";
 Serial.print(sizeof(hola));

No devuelve 4 sino 5 por el carácter nulo final (hola[0] a hola[4] incluidos).

Espero haberte aclarado bien todo esto.
Saludos

1 Like