Durchlaufen von Werten in einem Array von Zeichenfolgen zum Drucken von

Ich (glaube ich) versuche, die Werte eines Arrays zu durchlaufen und die Zeichenfolge in einem tft zu drucken . Ich habe das Array von 4 Strings deklariert, und das funktioniert gut. Aber wenn ich versuche, es zu drucken, bekomme ich Müll. Fehlt mir eine Drucknuance? Oder verstehe ich einfach nicht, wie man Arrays und Strings verwendet …?

Der Code lautet wie folgt:

Deklarationen:

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

Verwenden Sie (beachten Sie die falsche if-Anweisung für die Frage)

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

Stattdessen erhalte ich die meiste Zeit zufällige Zeichen, manchmal nichts.

Falls es sich um eine Speichersache handelt, beachten Sie bitte Folgendes:

Sketch verwendet 26.480 Byte (92%) des Programmspeicherplatzes. Das Maximum beträgt 28.672 Bytes. Globale Variablen belegen 1.126 Bytes (43%) des dynamischen Speichers, während 1.434 Bytes für lokale Variablen übrig bleiben. Das Maximum beträgt 2.560 Byte.

Kommentare

  • Vielleicht ist die Baudrate falsch? Oder ist activeSystem größer als 3 und überschreitet die Grenzen?
  • ^ Bingo. Ich hatte keinen Haken an activeSystem.
  • Ich wusste nicht, wie schnell es sich wiederholte und es in Millisekunden überging. es ging dann durch eine Menge Speicher, der den ganzen Weg Müll spuckte. Mann, ich fühle mich gerade dumm

Antwort

Wenn die Variable activeSystem überschreitet die Länge des Arrays, es ist außerhalb der Grenzen, an diesem Punkt ist das Verhalten undefiniert.
In Ihrem Fall erhalten Sie „Garbage Data“, bei denen es sich eigentlich nur um Daten im Speicher nach dem Array handelt.

Da dies keine implizite Überprüfung für Array-Grenzen ist, müssen Sie diese selbst überprüfen.

Antwort

I. Ich denke, dies ist der richtige Weg, um ein Array von C-Strings zu erstellen:

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

Da Strings im Grunde genommen als Zeichenzeiger gespeichert sind, ist ein Array von Strings ein Array von char * -Variablen. Oder Sie können ein Array von Arduino-Zeichenfolgen erstellen:

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

Antwort

Ich bin nicht sicher, ob ich 100% verstehe, aber hier ist mein bester Schuss. Wenn das Folgende falsch ist, liegt das Problem nicht daran, dass nicht genügend Speicher vorhanden ist. Versuchen Sie dies

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

Ihre Leitung

char hvacSystem s [4] [5] = {„Aus“, „Lüfter“, „Kühlen“, „Heizen“};

Sie versuchen hier, ein zweidimensionales Array zu erstellen. Im Wesentlichen ein 4×5 Tisch. Mit Ihrem Code, wenn Sie

tft.print (hvacSystems [0] [1]) ausführen;

Es sollte „Aus“ geben. Grundsätzlich haben Sie eine Tabelle erstellt, die wie folgt aussieht:

0 {„Aus“, „Lüfter“, „Kühlen“, „Heizen“, 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

Kommentare

  • Ohne die zweite Dimension oder mit der Nr Abmessungen. Dies ist sinnvoll, wenn Sie bedenken, dass ein String ein Array von Zeichen ‚ 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 „}

Antwort

Die Das Problem scheint nicht das zu sein, was Sie denken, da ich es nicht reproduzieren kann.

Siehe dies:

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

Ausgabe :

Off Fan 

Bitte veröffentlichen Sie eine vollständige Skizze, die das Problem reproduziert. Die Platzierung von Variablen und ihr Typ können das Ergebnis beeinflussen.

Ich habe Serial.println () verwendet, um den erwarteten Inhalt der Variablen anzuzeigen.


Möglicherweise funktioniert dies besser:

tft.print(displayActiveSystem.c_str ()); 

Kommentare

  • , während Sie durch meinen fehlenden Code behindert wurden Das Problem war da. activeSystem war unbegrenzt und indizierte ungültige Bereiche von hvacSystems nach 3 Schleifen. Die Schleifen laufen so schnell, dass ich zu Beginn die gültigen Daten übersehen habe.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.