나 (생각해보십시오) 배열의 값을 반복하고 문자열을 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보다 크고 경계를 벗어 났습니까?
- ^ Bingo. 나는 activeSystem에 대한 캐치가 없었습니다.
- 얼마나 빨리 반복되는지 몰랐고 밀리 초 만에 끝났습니다. 그런 다음 쓰레기를 뱉어내는 많은 메모리를 통해 진행되었습니다. Man 지금 바보 같은 느낌
답변
변수 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); }
Answer
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 차원 배열을 생성하려고합니다. 기본적으로 4×5 테이블입니다. 코드를 사용하면
tft.print (hvacSystems [0] [1]);
“Off”가됩니다. 기본적으로
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
댓글
- 두 번째 차원없이 컴파일되지 않습니다. 치수. 문자열이 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
의 유효하지 않은 영역을 인덱싱했습니다. 루프가 너무 빨리 실행되어 처음에 유효한 데이터를 놓쳤습니다.