I (think I) am trying to iterate through the values of an array and print the string to a tft . Deklaroval jsem pole 4 řetězců, a to funguje dobře. Ale když se to pokusím vytisknout, dostanu odpadky. Chybí mi nuance tisku? Nebo nerozumím tomu, jak používat pole a řetězce …?
Kód je následující:
Deklarace:
//Active System char hvacSystems[4][5] = {"Off", "Fan", "Cool", "Heat"}; int activeSystem = 0; String displayActiveSystem = hvacSystems[activeSystem]; <-- Should now be String "off"
Použít (u otázky si všimněte falešného příkazu if)
if(systemNeedsToBeCycled){ activeSystem++; displayActiveSystem = hvacSystems[activeSystem]; <-- Should now be String "Fan" tft.print(displayActiveSystem); }
Místo toho dostávám většinu času náhodné znaky, někdy nic.
V případě, že jde o paměť, mějte na paměti, že:
Skica využívá 26 480 bajtů (92%) programového úložného prostoru. Maximum je 28 672 bajtů. Globální proměnné využívají 1126 bajtů (43%) dynamické paměti, přičemž lokálním proměnným zbývá 1434 bajtů. Maximum je 2 560 bajtů.
Komentáře
- Možná je přenosová rychlost špatná? Nebo activeSystem je větší než 3 a dostává se z hranic?
- ^ Bingo. Nechtěl jsem zachytit activeSystem.
- Neuvědomil jsem si, jak rychle to smyčkovalo a šlo to za milisekundy. pak to postupovalo hromadou paměti, která celou cestu plivala na odpadky. Člověče, teď se cítím hloupě
Odpovědět
Pokud proměnná activeSystem
překračuje délku pole, je mimo hranice, kdy je chování nedefinováno.
Ve vašem případě dostanete „garbage data“, což jsou vlastně jen data v paměti po poli.
Protože neexistuje implicitní kontrola hranic pole, musíte je zkontrolovat sami.
Odpovědět
I myslím, že toto je správný způsob, jak vytvořit pole řetězců 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); }
Vzhledem k tomu, že řetězce jsou v zásadě uloženy jako ukazatele char, takže pole řetězců je pole char * variables. Nebo můžete vytvořit řadu řetězců 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
Nejsem si jistý, jestli tomu rozumím na 100%, ale tady je můj nejlepší zásah. Pokud je níže chyba, problém není způsoben nedostatkem paměti. Zkuste to
//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); }
Vaše linka
char hvacSystem s [4] [5] = {„Off“, „Fan“, „Cool“, „Heat“};
Pokoušíte se zde vytvořit dvourozměrné pole. V podstatě stůl 4×5. Pokud používáte svůj kód,
tft.print (hvacSystems [0] [1]);
Mělo by vám dát „Vypnuto“. V zásadě jste vytvořili tabulku, která vypadá jako
0 {„Vypnuto“, „Ventilátor“, „Cool“, „Heat“, null}
1 {null, null, null, null, null}
2 {null, null, null, null, null}
3 {null, null, null, null, null}
Pole : https://www.arduino.cc/en/Reference/Array 2D pole:
http://forum.arduino.cc/index.php?topic=220385.0
Komentáře
- Nebude kompilován bez druhé dimenze nebo bez dimenze. Což dává smysl, pokud si myslíte, že řetězec je pole znaků ‚ 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 „}
odpověď
Zdá se, že problém není takový, jaký si myslíte, že je, protože ho nemohu reprodukovat.
Viz toto:
//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
Výstup :
Off Fan
Zašlete prosím kompletní náčrt, který reprodukuje problém. Umístění proměnných a jejich typ může ovlivnit výsledek.
Použil jsem Serial.println () k zobrazení obsahu proměnných, což jste očekávali.
Možná to bude fungovat lépe:
tft.print(displayActiveSystem.c_str ());
Komentáře
- zatímco vám překážel můj nedostatek kódu , problém tam byl.
activeSystem
byl neomezený a indexoval neplatné oblastihvacSystems
po 3 smyčkách. Smyčky běží tak rychle, že mi na začátku chyběla platná data.