herhaal waarden in een array van strings om af te drukken

Ik (denk dat ik) probeer de waarden van een array te herhalen en de string af te drukken naar een tft . Ik heb de reeks van 4 strings verklaard, en dat werkt prima. Maar als ik het probeer af te drukken, krijg ik rotzooi. Mis ik een nuance van print? Of begrijp ik gewoon niet hoe ik arrays en strings moet gebruiken …?

De code is als volgt:

Verklaringen:

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

Gebruik (let op de nep-if-instructie voor de vraag)

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

In plaats daarvan krijg ik meestal willekeurige tekens, soms niets.

Als het om geheugen gaat, weet dan dat:

Sketch 26.480 bytes (92%) programma-opslagruimte gebruikt. Het maximum is 28.672 bytes. Globale variabelen gebruiken 1.126 bytes (43%) dynamisch geheugen, waardoor er 1.434 bytes overblijven voor lokale variabelen. Het maximum is 2560 bytes.

Reacties

  • Misschien is de baudrate verkeerd? Of activeSystem is groter dan 3 en gaat buiten de grenzen?
  • ^ Bingo. Ik had geen vangst op activeSystem.
  • Ik realiseerde me niet hoe snel het een lus maakte en het ging in milliseconden voorbij. het ging toen door een hoop geheugen spugende rotzooi helemaal. Man, ik voel me nu stom

Antwoord

Als de variabele activeSystem overschrijdt de lengte van de array, het is buiten het bereik, op welk punt het gedrag ongedefinieerd is.
In jouw geval krijg je “garbage data”, wat eigenlijk gewoon data in het geheugen zijn na de array.

Omdat het geen impliciete controle is voor arraygrenzen, moet u deze zelf controleren.

Answer

I denk dat dit de juiste manier is om een array van C-strings te maken:

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

Aangezien strings in feite worden opgeslagen als teken-pointers, is een array van strings een array van char * variabelen. Of je zou een array van Arduino-strings kunnen maken:

 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

Ik weet niet zeker of ik het 100% begrijp, maar dit is mijn beste kans. Als het onderstaande niet klopt, is het probleem niet te wijten aan een tekort aan geheugen. Probeer dit

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

Jouw regel

char hvacSystem s [4] [5] = {“Off”, “Fan”, “Cool”, “Heat”};

U probeert hier een tweedimensionale array te maken. In wezen een 4×5-tafel. Met je code als je dat doet

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

Het zou je “Off” moeten geven. In feite heb je een tabel gemaakt die eruitziet als

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

Reacties

  • Het zal niet compileren zonder de tweede dimensie of zonder dimensie. Dat is logisch als je bedenkt dat een string een array is van 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 “}

Antwoord

De probleem lijkt niet te zijn wat u denkt dat het is, omdat ik het “niet kan reproduceren.

Zie dit:

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

Uitvoer :

Off Fan 

Plaats een volledige schets die het probleem reproduceert. De plaatsing van variabelen en hun type kan van invloed zijn op het resultaat.

Ik heb Serial.println () gebruikt om de inhoud van de variabele te laten zien, wat je verwachtte.


Mogelijk werkt dit beter:

tft.print(displayActiveSystem.c_str ()); 

Reacties

  • terwijl je werd gehinderd door mijn gebrek aan code , het probleem was er. activeSystem was onbeperkt en indexeerde ongeldige gebieden van hvacSystems na 3 lussen. De lussen lopen zo snel dat ik in het begin de geldige gegevens heb gemist.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *