scorrere i valori in un array di stringhe per stampare

Io (penso di) sto provando a scorrere i valori di un array e stampare la stringa in un tft . Ho dichiarato larray di 4 stringhe e funziona bene. Ma quando provo a stamparlo, ottengo spazzatura. Mi manca una sfumatura di stampa? O semplicemente non capisco come usare array e stringhe …?

Il codice è il seguente:

Dichiarazioni:

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

Usa (nota la falsa dichiarazione if per la domanda)

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

Invece ottengo caratteri casuali la maggior parte del tempo, a volte niente.

Nel caso sia una questione di memoria, tieni presente che:

Sketch utilizza 26.480 byte (92%) di spazio di archiviazione del programma. Il massimo è 28.672 byte. Le variabili globali utilizzano 1.126 byte (43%) di memoria dinamica, lasciando 1.434 byte per le variabili locali. Il massimo è 2.560 byte.

Commenti

  • Forse il baudrate è sbagliato? O activeSystem è più grande di 3 e esce dai limiti?
  • ^ Bingo. ActiveSystem non era in grado di catturare.
  • Non mi rendevo conto di quanto velocemente andava in loop e si risolveva in millisecondi. è poi progredito attraverso un mucchio di spazzatura che sputava memoria fino in fondo. Amico, mi sento stupido adesso

Rispondi

Se la variabile activeSystem supera la lunghezza dellarray, è fuori dai limiti, a quel punto il comportamento è indefinito.
Nel tuo caso ottieni “dati inutili”, che in realtà sono solo dati in memoria dopo larray.

Poiché non è un controllo implicito per i limiti di array, è necessario controllarli da soli.

Answer

I penso che questo sia il modo corretto per creare un array di stringhe 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); } 

Poiché le stringhe sono fondamentalmente memorizzate come puntatori di caratteri, quindi un array di stringhe è char *. Oppure puoi creare un array di stringhe 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); } 

Answer

Non sono sicuro di aver capito al 100%, ma qui è il mio colpo migliore. Se quanto riportato di seguito è sbagliato, il problema non è dovuto alla mancanza di memoria. Prova questo

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

La tua riga

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

Stai tentando di creare un array bidimensionale qui. Essenzialmente un tavolo 4×5. Con il tuo codice, se lo fai

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

Dovrebbe darti “Off”. Fondamentalmente hai creato una tabella che assomiglia a

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

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

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

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

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

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

Commenti

  • Non verrà compilato senza la seconda dimensione o senza dimensione. Il che ha senso se consideri che una stringa è un array di caratteri ‘ 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 “}

Risposta

Il il problema non sembra essere quello che pensi, perché non posso “riprodurlo.

Vedi questo:

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

Risultato :

Off Fan 

Pubblica uno schizzo completo che riproduca il problema. Il posizionamento delle variabili e il loro tipo potrebbero influenzare il risultato.

Ho usato Serial.println () per mostrare il contenuto delle variabili, che è quello che ti aspettavi.


Forse funzionerà meglio:

tft.print(displayActiveSystem.c_str ()); 

Commenti

  • mentre eri ostacolato dalla mia mancanza di codice , il problema era lì. activeSystem era illimitato e indicizzava aree non valide di hvacSystems dopo 3 cicli. I cicli sono così veloci che allinizio ho perso i dati validi.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *