iteruj po wartościach w tablicy ciągów, aby wydrukować

Ja (chyba tak) próbuję iterować przez wartości tablicy i wypisać ciąg do tft . Zadeklarowałem tablicę 4 ciągów i to działa dobrze. Ale kiedy próbuję to wydrukować, dostaję śmieci. Czy brakuje mi niuansów druku? A może po prostu nie rozumiem, jak używać tablic i ciągów …?

Kod wygląda następująco:

Deklaracje:

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

Użyj (zwróć uwagę na fałszywe stwierdzenie if w pytaniu)

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

Zamiast tego najczęściej otrzymuję losowe znaki, czasem nic.

Jeśli chodzi o pamięć, pamiętaj, że:

Sketch wykorzystuje 26 480 bajtów (92%) miejsca w pamięci programu. Maksymalnie 28 672 bajtów. Zmienne globalne zajmują 1126 bajtów (43%) pamięci dynamicznej, pozostawiając 1434 bajty na zmienne lokalne. Maksymalnie 2560 bajtów.

Komentarze

  • Może szybkość transmisji jest nieprawidłowa? Lub activeSystem jest większy niż 3 i wychodzi poza granice?
  • ^ Bingo. Nie udało mi się złapać systemu activeSystem.
  • Nie zdawałem sobie sprawy, jak szybko się zapętlał i minęło kilka milisekund. następnie przeszedł przez garść wspomnień, wypluwając śmieci. Człowieku, czuję się teraz głupio

Odpowiedź

Jeśli zmienna activeSystem przekracza długość tablicy, jest poza zakresem, w którym to momencie zachowanie jest niezdefiniowane.
W twoim przypadku otrzymujesz „śmieciowe dane”, które w rzeczywistości są po prostu danymi w pamięci po tablicy.

Ponieważ nie ma niejawnego sprawdzenia granic tablicy, musisz sprawdzić je samodzielnie.

Odpowiedź

I myślę, że jest to właściwy sposób tworzenia tablicy ciągów 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); } 

Ponieważ łańcuchy są zasadniczo przechowywane jako wskaźniki znaków, więc tablica ciągów jest tablicą char * zmienne. Możesz też utworzyć tablicę ciągów 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); } 

Odpowiedź

Nie jestem pewien, czy rozumiem w 100%, ale oto moje najlepsze ujęcie. Jeśli poniższe informacje są nieprawidłowe, problem nie wynika z braku pamięci. Spróbuj tego

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

Twoja linia

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

Próbujesz tutaj utworzyć dwuwymiarową tablicę. Zasadniczo stół 4×5. Z kodem, jeśli to zrobisz

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

Powinien dać ci „Off”. Zasadniczo utworzyłeś tabelę, która wygląda następująco:

0 {„Off”, „Fan”, „Cool”, „Heat”, null}

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

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

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

Tablice : https://www.arduino.cc/en/Reference/Array Tablice 2d:

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

Komentarze

  • Nie skompiluje się bez drugiego wymiaru lub bez wymiar. Ma to sens, jeśli weźmiesz pod uwagę, że ciąg znaków jest tablicą znaków ' 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 „}

Odpowiedź

Problem nie wygląda na to, co myślisz, ponieważ nie mogę go odtworzyć.

Zobacz to:

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

Wynik :

Off Fan 

Prześlij kompletny szkic, który odtwarza problem. Umiejscowienie zmiennych i ich typ mogą mieć wpływ na wynik.

Użyłem Serial.println (), aby pokazać zawartość zmiennej, której się spodziewałeś.


Prawdopodobnie to zadziała lepiej:

tft.print(displayActiveSystem.c_str ()); 

Komentarze

  • , gdy przeszkadzał ci mój brak kodu , problem tam był. activeSystem był nieograniczony i indeksowanie nieprawidłowych obszarów hvacSystems po 3 pętlach. Pętle działają tak szybko, że na początku przeoczyłem prawidłowe dane.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *