a karakterláncok tömbjeiben végigvezetem az értékeket a nyomtatáshoz

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 a hvacSystems érvénytelen területeket. A hurkok olyan gyorsan futnak, hogy az elején hiányoltam az érvényes adatokat.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük