문자열 배열의 값을 반복하여 인쇄

나 (생각해보십시오) 배열의 값을 반복하고 문자열을 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의 유효하지 않은 영역을 인덱싱했습니다. 루프가 너무 빨리 실행되어 처음에 유효한 데이터를 놓쳤습니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다