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 dihvacSystems
dopo 3 cicli. I cicli sono così veloci che allinizio ho perso i dati validi.