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ówhvacSystems
po 3 pętlach. Pętle działają tak szybko, że na początku przeoczyłem prawidłowe dane.