iterar a través de los valores en una matriz de cadenas para imprimir

Yo (creo que) estoy tratando de iterar a través de los valores de una matriz e imprimir la cadena en un tft . He declarado la matriz de 4 cadenas y funciona bien. Pero cuando intento imprimirlo, aparece basura. ¿Me falta un matiz de impresión? ¿O simplemente no entiendo cómo usar matrices y cadenas …?

El código es el siguiente:

Declaraciones:

//Active System char hvacSystems[4][5] = {"Off", "Fan", "Cool", "Heat"}; int activeSystem = 0; String displayActiveSystem = hvacSystems[activeSystem]; <-- Should now be String "off" 

Use (observe la declaración if falsa para la pregunta)

 if(systemNeedsToBeCycled){ activeSystem++; displayActiveSystem = hvacSystems[activeSystem]; <-- Should now be String "Fan" tft.print(displayActiveSystem); } 

En su lugar, obtengo caracteres aleatorios la mayor parte del tiempo, a veces nada.

En caso de que se trate de una cuestión de memoria, tenga en cuenta que:

Sketch utiliza 26,480 bytes (92%) del espacio de almacenamiento del programa. El máximo es 28 672 bytes. Las variables globales utilizan 1.126 bytes (43%) de memoria dinámica, dejando 1.434 bytes para las variables locales. El máximo es 2.560 bytes.

Comentarios

  • ¿Quizás la velocidad en baudios es incorrecta? ¿O activeSystem es mayor que 3 y se sale de los límites?
  • ^ Bingo. No tuve una trampa en activeSystem.
  • No me di cuenta de lo rápido que se repitió y pasó en milisegundos. luego avanzó a través de un montón de memoria escupiendo basura hasta el final. Hombre, me siento estúpido en este momento

Responder

Si la variable activeSystem excede la longitud de la matriz, está fuera de los límites, momento en el que el comportamiento no está definido.
En su caso, obtiene «datos basura», que en realidad son solo datos en la memoria después de la matriz.

Debido a que no hay una verificación implícita de los límites de la matriz, debe verificarlos usted mismo.

Respuesta

I creo que esta es la forma correcta de crear una matriz de cadenas C:

 char * hvacSystems[] = {"Off", "Fan", "Cool", "Heat"}; int activeSystem = 0; char * displayActiveSystem = hvacSystems[activeSystem]; if(systemNeedsToBeCycled){ activeSystem++; // make sure to set a bound for this variable displayActiveSystem = hvacSystems[activeSystem]; tft.print(displayActiveSystem); } 

Dado que las cadenas se almacenan básicamente como punteros de caracteres, una matriz de cadenas es una matriz de char * variables. O puede crear una matriz de cadenas de Arduino:

 String hvacSystems[] = {"Off", "Fan", "Cool", "Heat"}; int activeSystem = 0; String displayActiveSystem = hvacSystems[activeSystem]; if(systemNeedsToBeCycled){ activeSystem++; // make sure to set a bound for this variable displayActiveSystem = hvacSystems[activeSystem]; tft.print(displayActiveSystem); } 

Respuesta

No estoy seguro de haber entendido al 100%, pero esta es mi mejor oportunidad. Si lo siguiente es incorrecto, el problema no se debe a que no haya memoria. Pruebe esto

//Active System char hvacSystems[] = {"Off", "Fan", "Cool", "Heat"}; // or char hvacSystems[4] = {"Off", "Fan", "Cool", "Heat"} int activeSystem = 0; String displayActiveSystem = hvacSystems[activeSystem]; <-- Should now be String "off" if(systemNeedsToBeCycled){ activeSystem++; displayActiveSystem = hvacSystems[activeSystem]; <-- Should now be String "Fan" tft.print(displayActiveSystem); } 

Su línea

char hvacSystem s [4] [5] = {«Apagado», «Ventilador», «Frío», «Calor»};

Estás intentando crear una matriz bidimensional aquí. Esencialmente una mesa de 4×5. Con su código si lo hace

tft.print (hvacSystems [0] [1]);

Debería darle «Off». Básicamente, creó una tabla que parece

0 {«Apagado», «Ventilador», «Frío», «Calor», nulo}

1 {nulo, nulo, nulo, nulo, nulo}

2 {nulo, nulo, nulo, nulo, nulo}

3 {nulo, nulo, nulo, nulo, nulo}

Arrays : https://www.arduino.cc/en/Reference/Array Matrices 2d:

http://forum.arduino.cc/index.php?topic=220385.0

Comentarios

  • No se compila sin la segunda dimensión o sin dimensión. Lo cual tiene sentido si considera que una cadena es una matriz de char ‘ s [4] [5] 0 {» O «, » F «, » C «, » H «} 1 {» f «, » a «, » o «, » e «} 2 {» f «, » n «, » o «, » a » } 3 {» / 0 «, » / 0 «, » l «, » t } 4 {null, null, » / 0 «, » / 0 «}

Respuesta

El El problema no parece ser lo que crees que es porque no puedo reproducirlo.

Mira esto:

//Active System char hvacSystems[4][5] = {"Off", "Fan", "Cool", "Heat"}; int activeSystem = 0; String displayActiveSystem; bool systemNeedsToBeCycled = true; void setup () { Serial.begin (115200); Serial.println (); displayActiveSystem = hvacSystems[activeSystem]; // <-- Should now be String "off" Serial.println (displayActiveSystem); if(systemNeedsToBeCycled){ activeSystem++; displayActiveSystem = hvacSystems[activeSystem]; // <-- Should now be String "Fan" Serial.println (displayActiveSystem); } } // end of setup void loop () { } // end of loop 

Salida :

Off Fan 

Por favor publique un boceto completo que reproduzca el problema. La ubicación de las variables y su tipo pueden influir en el resultado.

Usé Serial.println () para mostrar el contenido de la variable, que es lo que esperaba.


Posiblemente esto funcionará mejor:

tft.print(displayActiveSystem.c_str ()); 

Comentarios

  • mientras te obstaculizaba mi falta de código , el problema estaba ahí. activeSystem era ilimitado e indexaba áreas no válidas de hvacSystems después de 3 bucles. Los bucles se ejecutan tan rápido que me perdí los datos válidos al principio.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *