iterera genom värden i en rad strängar för att skriva ut

Jag (tror jag) försöker itera igenom värdena för en array och skriva ut strängen till en tft . Jag har förklarat en rad fyra strängar, och det fungerar bra. Men när jag försöker skriva ut får jag skräp. Saknar jag en nyans av tryck? Eller förstår jag bara inte hur man använder matriser och strängar …?

Koden är som följer:

Deklarationer:

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

Använd (notera det falska if-uttalandet för frågan)

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

Istället får jag slumpmässiga tecken för det mesta, ibland ingenting.

Om det är en minnes sak, vänligen veta att:

Skiss använder 26.480 byte (92%) av programlagringsutrymmet. Maximalt är 28 672 byte. Globala variabler använder 1 126 byte (43%) av det dynamiska minnet, vilket lämnar 1434 byte för lokala variabler. Maximalt är 2 560 byte.

Kommentarer

  • Kanske är baudrat fel? Eller är activeSystem större än 3 och går utanför gränserna?
  • ^ Bingo. Jag fick inte tag på activeSystem.
  • Jag förstod inte hur snabbt det slingrade och det gick över på millisekunder. det fortsatte sedan genom ett gäng minne som spottade sopor hela vägen. Man jag känner mig dum just nu

Svar

Om variabeln activeSystem överskrider längden på matrisen, den är utanför gränserna, vid vilken tidpunkt beteendet är odefinierat.
I ditt fall får du ”skräpdata”, som faktiskt bara är data i minnet efter matrisen.

Eftersom det inte finns någon implicit kontroll av arraygränser måste du kontrollera dem själv.

Svar

I tror att detta är det rätta sättet att skapa en array med C-strängar:

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

Eftersom strängar i grund och botten lagras som char-pekare så är en array med strängar en array med variabler för char *. Eller så kan du skapa en rad Arduino-strängar:

 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

Jag är inte säker på att jag förstår 100% men här är min bästa bild. Om nedanstående är fel beror problemet inte på att minnet är slut. Prova detta

//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] = {”Off”, ”Fan”, ”Cool”, ”Heat”};

Du försöker skapa en tvådimensionell array här. I huvudsak ett 4×5 bord. Med din kod om du gör

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

Det borde ge dig ”Av”. I grund och botten skapade 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 kompileras inte utan den andra dimensionen eller utan dimensionera. Vilket är vettigt om du anser att en sträng är en matris 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 verkar inte vara vad du tycker det är, för jag kan inte reproducera det.

Se detta:

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

Lägg upp en fullständig skiss som återger problemet. Placeringen av variabler och deras typ kan påverka resultatet.

Jag använde Serial.println () för att visa variabelinnehållet, vilket är vad du förväntade dig.


Möjligen fungerar det bättre:

tft.print(displayActiveSystem.c_str ()); 

Kommentarer

  • medan du hindrades av min brist på kod , problemet var där. activeSystem var obegränsat och indexerade ogiltiga områden av hvacSystems efter tre slingor. Slingorna går så fort att jag saknade giltiga data i början.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *