Jeg (tror jeg) prøver å iterere gjennom verdiene til en matrise og skrive strengen til en tft . Jeg har erklært en rekke fire strenger, og det fungerer bra. Men når jeg prøver å trykke den, får jeg søppel. Mangler jeg en nyanse av trykk? Eller forstår jeg bare ikke hvordan jeg bruker matriser og strenger …?
Koden er som følger:
Erklæringer:
//Active System char hvacSystems[4][5] = {"Off", "Fan", "Cool", "Heat"}; int activeSystem = 0; String displayActiveSystem = hvacSystems[activeSystem]; <-- Should now be String "off"
Bruk (merk den falske if-setningen for spørsmålet)
if(systemNeedsToBeCycled){ activeSystem++; displayActiveSystem = hvacSystems[activeSystem]; <-- Should now be String "Fan" tft.print(displayActiveSystem); }
I stedet får jeg tilfeldige tegn mesteparten av tiden, noen ganger ingenting.
Hvis det er en minneting, må du vite at:
Sketch bruker 26.480 byte (92%) av programlagringsplassen. Maksimum er 28 672 byte. Globale variabler bruker 1126 byte (43%) av dynamisk minne, og etterlater 1434 byte for lokale variabler. Maksimum er 2 560 byte.
Kommentarer
- Kanskje baudratet er feil? Eller er activeSystem større enn 3 og det kommer utenfor grensene?
- ^ Bingo. Jeg hadde ikke fangst på activeSystem.
- Jeg visste ikke hvor raskt det gikk i loop, og det gikk over i millisekunder. det gikk deretter gjennom en haug med minne som spytt søppel hele veien. Mann jeg føler meg dum akkurat nå
Svar
Hvis variabelen activeSystem
overstiger lengden på matrisen, den er utenfor grensene, på hvilket tidspunkt oppførselen er udefinert.
I ditt tilfelle får du «søppeldata», som faktisk bare er data i minnet etter matrisen.
Fordi det ikke er noen implisitt sjekk for matrixgrenser, må du sjekke dem selv.
Svar
I tror dette er den riktige måten å lage en matrise av C-strenger:
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); }
Siden strengene i utgangspunktet er lagret som tegn, så er en rekke strengene en rekke variabler for char *. Eller du kan lage en rekke Arduino-strenger:
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); }
Svar
Jeg er ikke sikker på at jeg forstår 100%, men her er det beste bildet. Hvis det nedenfor er galt, skyldes ikke problemet at det er lite minne. Prøv dette
//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); }
Linjen din
char hvacSystem s [4] [5] = {«Off», «Fan», «Cool», «Heat»};
Du prøver å lage et todimensjonalt array her. I hovedsak et 4×5 bord. Med koden din hvis du gjør
tft.print (hvacSystems [0] [1]);
Den skal gi deg «Av». I utgangspunktet laget du en tabell som ser ut som
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 2d Arrays:
http://forum.arduino.cc/index.php?topic=220385.0
Kommentarer
- Den kompileres ikke uten andre dimensjon eller uten dimensjon. Noe som er fornuftig hvis du vurderer at en streng er en matrise med 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 «}
Svar
problemet ser ikke ut til å være det du tror det er, fordi jeg ikke kan reprodusere det.
Se dette:
//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
Output :
Off Fan
Legg ut en fullstendig skisse som gjengir problemet. Plasseringen av variabler, og deres type, kan påvirke resultatet.
Jeg brukte Serial.println () for å vise variabelinnholdet, som er det du forventet.
Muligens vil dette fungere bedre:
tft.print(displayActiveSystem.c_str ());
Kommentarer
- mens du ble hindret av min manglende kode , problemet var der.
activeSystem
var ubegrenset og indekserte ugyldige områder avhvacSystems
etter tre sløyfer. Sløyfene løper så fort at jeg savnet gyldige data i begynnelsen.