I (gondolom, hogy) egy tömb értékein keresztül próbálok iterálni, és a karakterláncot tft-be nyomtatom . Deklaráltam 4 húr tömbjét, és ez jól működik. De amikor megpróbálom kinyomtatni, szemetet kapok. Hiányzik a nyomtatás egy árnyalata? Vagy csak nem értem a tömbök és karakterláncok használatát …?
A kód a következő:
Nyilatkozatok:
//Active System char hvacSystems[4][5] = {"Off", "Fan", "Cool", "Heat"}; int activeSystem = 0; String displayActiveSystem = hvacSystems[activeSystem]; <-- Should now be String "off"
Használja (vegye figyelembe a kérdés hamis if utasítását)
if(systemNeedsToBeCycled){ activeSystem++; displayActiveSystem = hvacSystems[activeSystem]; <-- Should now be String "Fan" tft.print(displayActiveSystem); }
Ehelyett legtöbbször véletlenszerű karaktereket kapok, néha semmit.
Abban az esetben, ha memória dolog, kérjük, vegye figyelembe, hogy:
A Sketch 26 480 bájtot (92%) használ a program tárterületén. A maximum 28 672 bájt. A globális változók 1126 bájt (43%) dinamikus memóriát használnak fel, így 1434 bájt marad a helyi változók számára. A maximum 2560 bájt.
Megjegyzések
- Lehet, hogy az adatátviteli sebesség nem megfelelő? Vagy az activeSystem nagyobb, mint 3, és meghaladja a határokat?
- ^ Bingo. Nem volt fogásom az activeSystem-en.
- Nem jöttem rá, hogy milyen gyorsan hurkolt, és ezredmásodpercek alatt ment át. ezután haladt keresztül egy rakás szemetet köpködő memórián. Ember, akit most hülyének érzem
Válasz
Ha a activeSystem
túllépi a tömb hosszát, nem lépi túl a határt, ekkor a viselkedés nincs meghatározva.
Az Ön esetében „szemétadatokat” kap, amelyek valójában csak a memóriában található adatok a tömb után.
Mivel a tömb határainak implicit ellenőrzése nincs, ezeket saját magának kell ellenőriznie.
Válasz
I szerintem ez a helyes módszer a C karakterláncok tömbjének létrehozására:
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); }
Mivel a karakterláncokat alapvetően char-mutatókként tárolják, a stringek tömbje char * változók. Vagy létrehozhat egy tömb Arduino karakterláncot:
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); }
Válasz
Nem vagyok biztos benne, hogy 100% -ban értem, de itt van a legjobb lövésem. Ha az alábbiak hibásak, a probléma nem a memóriahiány miatt következik be. Próbálja ki ezt
//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); }
Az Ön sora
char hvacSystem s [4] [5] = {“Ki”, “Ventilátor”, “Hűvös”, “Meleg”};
Itt kétdimenziós tömböt próbál létrehozni. Lényegében egy 4×5-ös asztal. A kódoddal, ha megteszed
tft.print (hvacSystems [0] [1]);
“Ki” értéket ad. Alapvetően olyan táblázatot készített, amely a következőképpen néz ki:
0 {“Off”, “Fan”, “Cool”, “Heat”, null}
1 {null, null, null, null, null}
2 {null, null, null, null, null}
3 {null, null, null, null, null}
tömbök : https://www.arduino.cc/en/Reference/Array 2d tömbök:
http://forum.arduino.cc/index.php?topic=220385.0
Megjegyzések
- A második dimenzió nélkül vagy anélkül nem fog fordítani dimenzió. Ennek akkor van értelme, ha figyelembe vesszük, hogy a karakterlánc char ‘ s tömb [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 “}
Válasz
A Úgy tűnik, hogy a probléma nem az, aminek gondolod, mert nem tudom reprodukálni.
Lásd ezt:
//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
Kérjük, tegyen egy teljes vázlatot, amely megismétli a problémát. A változók elhelyezése és típusa befolyásolhatja az eredményt.
A Serial.println () függvényt használtam a változó tartalmának megjelenítésére, amire számítottál.
Valószínűleg ez jobban fog működni:
tft.print(displayActiveSystem.c_str ());
Megjegyzések
- miközben a kódhiányom akadályozott , a probléma ott volt. A
activeSystem
korlátlan volt, és 3 hurok után indexelte ahvacSystems
érvénytelen területeket. A hurkok olyan gyorsan futnak, hogy az elején hiányoltam az érvényes adatokat.