私は(私が思うに)配列の値を反復処理して文字列をtftに出力しようとしています。私は4つの文字列の配列を宣言しましたが、それは問題なく機能します。しかし、印刷しようとするとゴミが出ます。印刷のニュアンスが欠けていますか?または、配列と文字列の使用方法がわからないのですか…?
コードは次のとおりです。
宣言:
//Active System char hvacSystems[4][5] = {"Off", "Fan", "Cool", "Heat"}; int activeSystem = 0; String displayActiveSystem = hvacSystems[activeSystem]; <-- Should now be String "off"
使用(質問の偽のifステートメントに注意)
if(systemNeedsToBeCycled){ activeSystem++; displayActiveSystem = hvacSystems[activeSystem]; <-- Should now be String "Fan" tft.print(displayActiveSystem); }
代わりに、ほとんどの場合、ランダムな文字を取得しますが、何も取得しない場合もあります。
メモリの問題の場合は、次の点に注意してください。
Sketchは26,480バイト(92%)のプログラムストレージスペースを使用します。最大は28,672バイトです。グローバル変数は1,126バイト(43%)の動的メモリを使用し、ローカル変数用に1,434バイトを残します。最大は2,560バイトです。
コメント
- ボーレートが間違っている可能性がありますか?または、activeSystemが3より大きく、範囲を超えていますか?
- ^ビンゴ。 activeSystemをキャッチできませんでした。
- ループがどれほど速く、ミリ秒単位で終了したかわかりませんでした。それからそれはずっとゴミを吐き出すたくさんの記憶を通り抜けました。私は今愚かだと感じています
答え
変数activeSystem
が配列の長さを超えている場合、範囲外であるため、動作は定義されていません。
この場合、「ガベージデータ」が取得されます。これは、実際には配列の後のメモリ内のデータです。
は配列境界の暗黙的なチェックではないため、自分でチェックする必要があります。
回答
Iこれが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); }
文字列は基本的にcharポインターとして格納されるため、文字列の配列はchar *変数。または、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); }
回答
100%理解できるかどうかはわかりませんが、これが私のベストショットです。以下が間違っている場合は、メモリ不足が原因ではありません。これを試してください
//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); }
あなたの行
char hvacSystem s [4] [5] = {“Off”、 “Fan”、 “Cool”、 “Heat”};
ここで2次元配列を作成しようとしています。基本的に4x5のテーブル。コードを使用すると、
tft.print(hvacSystems [0] [1]);
「オフ」になります。基本的に、次のようなテーブルを作成しました
0 {“Off”、 “Fan”、 “Cool”、 “Heat”、null}
1 {null、null、null、 null、null}
2 {null、null、null、null、null}
3 {null、null、null、null、null}
配列: https://www.arduino.cc/en/Reference/Array 2Dアレイ:
http://forum.arduino.cc/index.php?topic=220385.0
コメント
- 2次元なし、またはなしではコンパイルされません寸法。文字列が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 "}
回答
問題は再現できないため、思ったとおりではないようです。
こちらをご覧ください:
//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
出力:
Off Fan
問題を再現した完全なスケッチを投稿してください。変数の配置とそのタイプが結果に影響を与える可能性があります。
Serial.println()を使用して、期待どおりの変数の内容を表示しました。
おそらくこれはうまくいくでしょう:
tft.print(displayActiveSystem.c_str ());
コメント
- 私のコードの欠如によって妨げられている間、 、問題はそこにありました。
activeSystem
は無制限で、3回のループ後にhvacSystems
の無効な領域にインデックスを付けました。ループが非常に高速であるため、最初に有効なデータを見逃しました。