iterere gennem værdier i en række strenge for at udskrive

Jeg (tror jeg) forsøger at gentage værdierne i en array og udskrive strengen til en tft . Jeg har erklæret en række af 4 strenge, og det fungerer fint. Men når jeg prøver at udskrive det, får jeg skrald. Mangler jeg en nuance af tryk? Eller forstår jeg bare ikke, hvordan man bruger arrays og strenge …?

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" 

Brug (bemærk den falske if-sætning til spørgsmålet)

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

I stedet får jeg tilfældige tegn det meste af tiden, undertiden intet.

Hvis det er en hukommelses ting, skal du vide, at:

Sketch bruger 26.480 bytes (92%) af programlagringspladsen. Maksimum er 28.672 bytes. Globale variabler bruger 1.126 bytes (43%) af den dynamiske hukommelse, hvilket efterlader 1.434 byte til lokale variabler. Maksimum er 2.560 byte.

Kommentarer

  • Måske er baudratet forkert? Eller er activeSystem større end 3, og det kommer ud af grænserne?
  • ^ Bingo. Jeg havde ikke fangst på activeSystem.
  • Jeg var ikke klar over, hvor hurtigt det sløjfede, og det gik over i millisekunder. det skred derefter gennem en flok hukommelse, der spyttede affald hele vejen. Mand jeg føler mig dum lige nu

Svar

Hvis variablen activeSystem overstiger længden af arrayet, det er uden for grænserne, på hvilket tidspunkt adfærd er udefineret.
I dit tilfælde får du “skraldata”, som faktisk kun er data i hukommelsen efter arrayet.

Da der ikke er nogen implicit kontrol for array-grænser, skal du selv kontrollere dem.

Svar

I tror dette er den rigtige måde at oprette en matrix af C-strenge på:

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

Da strengene grundlæggende er gemt som char-pegere, så er en række strenge en matrix af variabler af char *. Eller du kan oprette en række Arduino-strenge:

 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 mit bedste skud. Hvis nedenstående er forkert, skyldes problemet ikke, at hukommelsen er løbet tør. 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); } 

Din linje

char hvacSystem s [4] [5] = {“Fra”, “Ventilator”, “Cool”, “Varme”};

Du forsøger at oprette et todimensionelt array her. I det væsentlige et 4×5 bord. Med din kode, hvis du gør

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

Det skulle give dig “Fra”. Dybest set lavede du en tabel, der ligner

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 uden den anden dimension eller uden dimension. Hvilket giver mening, hvis du mener, at en streng er en matrix af 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 ud til at være, hvad du synes, det er, fordi jeg ikke kan reproducere 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 

Send venligst en komplet skitse, der gengiver problemet. Placeringen af variabler og deres type kan påvirke resultatet.

Jeg brugte Serial.println () til at vise variabelindholdet, hvilket er det, du forventede.


Muligvis fungerer dette bedre:

tft.print(displayActiveSystem.c_str ()); 

Kommentarer

  • mens du blev hindret af min manglende kode , problemet var der. activeSystem var ubegrænset og indekserede ugyldige områder af hvacSystems efter 3 sløjfer. Sløjferne kører så hurtigt, at jeg savnede de gyldige data i starten.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *