parcourir les valeurs dun tableau de chaînes pour afficher

Je (pense que jessaie) ditérer les valeurs dun tableau et imprimer la chaîne en tft . Jai déclaré le tableau de 4 chaînes, et cela fonctionne très bien. Mais quand jessaye de limprimer, je reçois des ordures. Est-ce que je manque une nuance dimpression? Ou est-ce que je ne comprends tout simplement pas comment utiliser les tableaux et les chaînes …?

Le code est le suivant:

Déclarations:

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

Utilisez (notez la fausse déclaration if pour la question)

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

Au lieu de cela, jobtiens des caractères aléatoires la plupart du temps, parfois rien.

Si cest une question de mémoire, sachez que:

Sketch utilise 26 480 octets (92%) despace de stockage du programme. Le maximum est de 28 672 octets. Les variables globales utilisent 1 126 octets (43%) de mémoire dynamique, laissant 1 434 octets pour les variables locales. Le maximum est de 2 560 octets.

Commentaires

  • Peut-être que le débit en bauds est incorrect? Ou activeSystem est plus grand que 3 et il sort des limites?
  • ^ Bingo. Je nai pas eu de capture sur activeSystem.
  • Je ne savais pas à quelle vitesse il a bouclé et il sest écoulé en millisecondes. il a ensuite progressé à travers un tas de mémoire crachant des ordures tout le chemin. Mec, je me sens stupide en ce moment

Réponse

Si la variable activeSystem dépasse la longueur du tableau, il « est hors limites, à quel point le comportement est indéfini.
Dans votre cas, vous obtenez des » données inutiles « , qui ne sont en fait que des données en mémoire après le tableau.

Comme il ny a pas de vérification implicite des limites du tableau, vous devez les vérifier vous-même.

Réponse

I pense que cest la bonne façon de créer un tableau de chaînes 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); } 

Puisque les chaînes sont essentiellement stockées comme des pointeurs de caractères, un tableau de chaînes est donc un tableau de variables char *. Ou vous pouvez créer un tableau de chaînes 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); } 

Réponse

Je ne suis pas sûr de comprendre à 100%, mais voici mon meilleur cliché. Si ce qui suit est faux, le problème nest pas dû à un manque de mémoire. Essayez ceci

//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); } 

Votre ligne

char hvacSystem s [4] [5] = {« Off », « Fan », « Cool », « Heat »};

Vous essayez de créer un tableau à deux dimensions ici. Essentiellement une table 4×5. Avec votre code si vous le faites

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

Cela devrait vous donner « Off ». En gros, vous avez créé un tableau qui ressemble à

0 {« Off », « Fan », « Cool », « Heat », null}

1 {null, null, null, null, null}

2 {null, null, null, null, null}

3 {null, null, null, null, null}

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

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

Commentaires

  • Il ne se compilera pas sans la deuxième dimension ou sans dimension. Ce qui est logique si vous considérez quune chaîne est un tableau de caractères ‘ 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 « }

Réponse

Le le problème ne semble pas être ce que vous pensez, car je ne peux pas le reproduire.

Voir ceci:

//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 

Sortie :

Off Fan 

Veuillez publier un croquis complet qui reproduit le problème. Le placement des variables et leur type peuvent influencer le résultat.

Jai utilisé Serial.println () pour afficher le contenu des variables, ce que vous attendiez.


Cela fonctionnera peut-être mieux:

tft.print(displayActiveSystem.c_str ()); 

Commentaires

  • pendant que vous étiez gêné par mon manque de code , le problème était là. activeSystem était illimité et indexait les zones non valides de hvacSystems après 3 boucles. Les boucles fonctionnent si vite que jai manqué les données valides au début.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *