2013-08-05 1 views
-1

내 Arduino에서 배열을 컴퓨터로 보내려고합니다. 그러나 배열을 수신 할 때마다 임의로 데이터가 두 번째로 변경되는 경우가 있습니다. 이것은 내가 포인터를 잘못 참조한 것으로 의심되지만, 구문에 문제가없는 것 같습니다.포인터에서 배열에 액세스하면 값이 달라집니다.

배열은 배열의 첫 번째 요소에 부울 *을 반환하는 buildreport()에 의해 생성됩니다. 그것은 직렬 회선을 통해 작성하는 loop()에 의해 사용됩니다.

//read pins 
boolean report[NUM_BUTTONS] = {0,0,0,0,0,0,0,0,0}; //I set this to all zeroes for testing and brevity 
boolean* x = &report[0]; 
return x; 

그리고 루프()

//if I don't read the serial, it will always be 
//available and execute forever. 

if(Serial.available() != 0){ 
incoming = Serial.read(); 
boolean* reports = buildreport(); 
//reports should now be the first element of the array 
for(int i=0;i<NUM_BUTTONS;i++){ 
    boolean x = *(reports+i); 
    //x is set to value at reports[0] plus i 

    Serial.write(x); 

} 
Serial.write(0x0d); //carriage return 
Serial.write(0x0a); //line feed 
} 

나는 시리얼 라인 아래로, 음, 무엇을 전송하여 배열을 요청할 때마다, 나는 1 또는 0이 아닌입니다 9 바이트를 얻을. 때로는 첫 번째 바이트가 변경됩니다.

+0

Arduino 스케치의 전체 목록을 제공하십시오. 스케치는 C 코드가 아니기 때문에 많은 C 규칙이 적용되지 않는다는 것을 기억하십시오. 또한 빠른 검사로 스케치가 PC와 동일한 매개 변수가있는 직렬 회선을 시작합니까? – JackCColeman

+0

@JackCColeman 뭐라구? 스케치 **는 ** C (또는 C++, 종속적 인) 코드입니다. –

+0

스케치는 프로그래머가 볼 수없는 큰 프로그램의 일부입니다. – JackCColeman

답변

1

report은 자동 저장 기간 배열이므로 함수가 반환되면 파괴됩니다. 그것을 사용하면 (x을 통해 첫 번째 요소에 대한 포인터) 정의되지 않은 동작이 호출됩니다.

배열을 만드는 함수가 필요하면 동적 메모리 할당 (malloc() 및 그 친구가 동반 됨)을 사용하거나 함수의 인수로 배열을 전달하고 함수가 적절한 값으로 채우도록해야합니다.

+0

함수에서 malloc()을 사용하여 해당 포인터를 반환하는 것은 생활주기를 이해하기 시작한 사람에게 좋은 조언입니다. 나는 그 결말이 잘 보이지 않는다. – jdr5ca

+0

루프()에서 배열을 생성하고 전달하는 방법을 고수하겠습니다. 도움을 주셔서 감사합니다! –

관련 문제