iteroi arvojen läpi merkkijonoryhmässä tulostaaksesi

Yritän iteroida taulukon arvojen läpi ja tulostaa merkkijonon TFT: ksi . Olen ilmoittanut 4 merkkijonon, ja se toimii hyvin. Mutta kun yritän tulostaa sen, saan roskaa. Puuttuuko minulta vivahde painosta? Vai eikö vain ymmärrä, miten taulukoita ja merkkijonoja käytetään …?

Koodi on seuraava:

Ilmoitukset:

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

Käytä (huomaa kysymyksen fake if -lauseke)

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

Sen sijaan saan suurimman osan ajasta satunnaisia merkkejä, joskus ei mitään.

Jos kyseessä on muisti, muista:

Sketch käyttää 26 480 tavua (92%) ohjelman tallennustilaa. Enimmäismäärä on 28 672 tavua. Globaalit muuttujat käyttävät 1126 tavua (43%) dynaamista muistia, jolloin paikallisiin muuttujiin jää 1434 tavua. Enimmäismäärä on 2560 tavua.

Kommentit

  • Ehkä baudinopeus on väärä? Tai activeSystem on suurempi kuin 3 ja se menee rajojen ulkopuolelle?
  • ^ Bingo. Minulla ei ollut aktiivisen järjestelmän kiinniottoa.
  • En tajunnut kuinka nopeasti se silmukoitui ja se meni yli millisekunnissa. sitten se eteni läpi joukon muistia, joka sylki roskat koko matkan. Mies tunnen olevani tyhmä juuri nyt

Vastaa

Jos muuttuja activeSystem ylittää taulukon pituuden, se on rajojen ulkopuolella, jolloin käyttäytymistä ei ole määritelty.
Sinun tapauksessasi saat ”roskatietoja”, jotka ovat itse asiassa vain muistissa olevia tietoja taulukon jälkeen.

Koska taulukon rajojen epäsuoraa tarkistusta ei ole, sinun on tarkistettava ne itse.

Vastaa

I luulen, että tämä on oikea tapa luoda joukko C-merkkijonoja:

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

Koska merkkijonot ovat pohjimmiltaan tallennettuina merkkijonoina, merkkijonoryhmä on char * -muuttujat. Tai voit luoda taulukon Arduino-merkkijonoista:

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

Vastaa

En ole varma, että ymmärrän 100%, mutta tässä on paras laukaukseni. Jos alla oleva virhe on väärä, ongelma ei johdu muistin loppumisesta. Kokeile tätä

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

Sinun linjasi

char hvacSystem s [4] [5] = {”Pois”, ”Tuuletin”, ”Viileä”, ”Lämpö”};

Yrität luoda tähän kaksiulotteisen taulukon. Pohjimmiltaan 4×5-pöytä. Koodisi kanssa, jos teet

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

Sen pitäisi antaa ”Pois”. Pohjimmiltaan teit taulukon, joka näyttää seuraavalta:

0 {”Pois”, ”Tuuletin”, ”Viileä”, ”Lämpö”, null}

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

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

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

Taulukot : https://www.arduino.cc/en/Reference/Array 2d-taulukot:

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

Kommentit

  • Se ei käänny ilman toista ulottuvuutta tai ilman ulottuvuus. Mikä on järkevää, jos otetaan huomioon, että merkkijono on taulukko 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 ”}

Vastaa

ongelma ei näytä olevan sitä mitä luulet sen olevan, koska en voi toistaa sitä.

Katso tämä:

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

Tulos :

Off Fan 

Lähetä täydellinen luonnos, joka toistaa ongelman. Muuttujien sijoittelu ja niiden tyyppi voivat vaikuttaa tulokseen.

Käytin Serial.println () -näyttöä muuttujien sisällön näyttämiseen, mitä odotit.


Mahdollisesti tämä toimii paremmin:

tft.print(displayActiveSystem.c_str ()); 

Kommentit

  • kun koodin puute vaikeutti sinua , ongelma oli siellä. activeSystem oli rajoittamaton ja indeksoi hvacSystems -alueen virheelliset alueet 3 silmukan jälkeen. Silmukat kulkevat niin nopeasti, että minulta puuttui alussa voimassa olevat tiedot.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *