iterați prin valori într-o matrice de șiruri pentru a imprima

Eu (cred că) încerc să iterez prin valorile unui tablou și să tipăresc șirul într-un tft . Am declarat matricea de 4 șiruri și asta funcționează bine. Dar când încerc să o imprim, primesc gunoi. Îmi lipsește o nuanță de imprimare? Sau pur și simplu nu înțeleg cum să folosesc tablouri și șiruri de caractere …?

Codul este după cum urmează:

Declarații:

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

Utilizați (rețineți declarația falsă if pentru întrebare)

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

În schimb primesc caractere aleatorii de cele mai multe ori, uneori nimic.

În cazul în care este o problemă de memorie, vă rugăm să știți că:

Sketch folosește 26.480 de octeți (92%) din spațiul de stocare al programului. Maximul este de 28.672 octeți. Variabilele globale utilizează 1.126 octeți (43%) de memorie dinamică, lăsând 1.434 octeți pentru variabilele locale. Maximul este de 2.560 de octeți.

Comentarii

  • Poate că rata de transmisie este greșită? Sau activeSystem este mai mare de 3 și se elimină?
  • ^ Bingo. Nu am avut o captură de pe ActiveSystem.
  • Nu mi-am dat seama cât de repede a trecut în buclă și a trecut în milisecunde. apoi a progresat printr-o grămadă de memorie care scuipă gunoi până la capăt. Omule, mă simt prost chiar acum

Răspunde

Dacă variabila activeSystem depășește lungimea matricei, este „în afara limitelor, moment în care comportamentul este nedefinit.
În cazul dvs., veți obține” date gunoi „, care sunt de fapt doar date în memorie după matrice.

Deoarece nu este o verificare implicită pentru limitele matricei, trebuie să le verificați singur.

Răspuns

I credeți că acesta este modul corect de a crea o matrice de șiruri de caractere 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); } 

Deoarece șirurile sunt stocate practic ca indicatori de caractere, deci o matrice de șiruri este o char * variabile. Sau puteți crea o matrice de șiruri 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ăspuns

Nu sunt sigur că înțeleg 100%, dar aici este cea mai bună fotografie a mea. Dacă cele de mai jos sunt greșite, problema nu se datorează lipsei de memorie. Încercați acest lucru

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

Linia ta

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

Încercați să creați aici o matrice bidimensională. În esență, o masă 4×5. Cu codul dvs. dacă faceți

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

Ar trebui să vă ofere „Dezactivat”. Practic ați creat un tabel care arată ca

0 {„Off”, „Fan”, „Cool”, „Heat”, null}

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

2 {nul, nul, nul, nul, nul}

3 {nul, nul, nul, nul, nul}

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

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

Comentarii

  • Nu se va compila fără a doua dimensiune sau fără dimensiune. Ceea ce are sens dacă considerați că un șir este o matrice de caractere ‘ 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ăspuns

problema nu pare a fi ceea ce credeți că este, deoarece nu o pot reproduce.

Vedeți acest lucru:

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

Ieșire :

Off Fan 

Vă rugăm să postați o schiță completă care reproduce problema. Plasarea variabilelor și tipul acestora ar putea influența rezultatul.

Am folosit Serial.println () pentru a afișa conținutul variabilei, care sunt ceea ce așteptați.


Este posibil ca acest lucru să funcționeze mai bine:

tft.print(displayActiveSystem.c_str ()); 

Comentarii

  • în timp ce ați fost împiedicat de lipsa mea de cod , problema era acolo. activeSystem a fost nelimitat și a indexat zone nevalide din hvacSystems după 3 bucle. Buclele rulează atât de repede încât am ratat datele valide la început.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *