2014-01-10 2 views
1

구조체를 Arduino와 함께 사용하려고하지만 구조체 포인터를 함수 호출로 전달할 수 없습니다. 주 기능을 추가하고 gcc로 내 컴퓨터를 컴파일 할 때 모든 것이 잘 작동하지만 Arduino IDE를 사용하면 오류가 발생합니다. 내가 시도Arduino : 포인터 구조체로 공용 구조체를 전달할 수 없습니다. gcc 컴파일러와 함께 할 수 있습니다.

코드이었다

typedef union 
{ 
    struct 
    { 
     unsigned unit :2; 
     unsigned channel:2; 
     unsigned status :1; 
     unsigned group :1; 
     unsigned remote :26; 
    }; 
    unsigned long data; 
} Signal; 

Signal signal; 

void testPassingStruct(Signal *variable) 
{ 
    variable->status = 1; 
} 

void setup() 
{ 
    signal.status = 1; 
    testPassingStruct(&signal); 
} 

void loop() 
{ 
} 

그리고 오류가 있었다 :

structtest:2: error: variable or field ‘testPassingStruct’ declared void 
structtest:2: error: ‘Signal’ was not declared in this scope 
structtest:2: error: ‘variable’ was not declared in this scope 

답변

2

당신은 여러 이름이 항목이있다. 이는 typedef과 함께 발생합니다. 당신은

void testPassingStruct(Signal *variable) 
{ 
    variable->d.status = 1; 
} 

또한 마스크와 비트 필드에 대한 정의를 사용할 수

union sig_union 
{ 
    struct 
    { 
     unsigned unit :2; 
     unsigned channel:2; 
     unsigned status :1; 
     unsigned group :1; 
     unsigned remote :26; 
    } d;      /* Note the name here. */ 
    unsigned long data; 
} signal; 
typedef union sig_union Signal; 

그런 다음 코드에서 당신이 필요로 시도 할 수 있습니다. 종종 어떤 비트가 더 명확하고 컴파일러가 두 경우 모두 비슷한 코드를 생성하는지 제어 할 수 있습니다. 예를 들어,

#define SIG_UNIT(d) (d&0x3) 
#define SIG_CHANNEL(d) (d&0xc>>2) 
#define SIG_STATUS(d) (d&0x10) 
/* etc. */ 

특히 비트가 중요 시스템 프로그래밍이 내가 'C'비트 필드들이 배치되는 방법을 지정할 수 있다고 생각하지 않는 것이 좋습니다. 무엇보다도, 나는 그것이 컴파일 될 것이라고 확신한다.

+1

ATMega/AVR에 중첩 된 구조체/공용체에 문제가있을 수 있습니다. 8 비트 레지스터가 제한되어 있습니다. 나는 보일러 플레이트 코드가 조금 더 있지만 정의가 확실히 작동 할 것이라고 생각한다. –

+1

4 바이트로 2 레지스터입니다. ATtiny10보다 강력한 것은 거의 없습니다. –

+1

@ IgnacioVazquez-Abrams 그렇습니다.하지만 대부분의 CPU에서는 단일 레지스터 일뿐입니다. 나는 컴파일러가이 문제를 가지고 있을지도 모른다는 사실을 알 수 없다고 말하고있다. 나는 내가 지적한 다른 문제라고 생각한다. 특히 레지스터 할당 인 경우 오류 메시지가 달라졌을 수 있습니다. –

3

기본적으로 구조체 멤버의 이름과 공용체가 부족합니다 (아래 코드에서이 파트를 호출했습니다). 이것을 시도하십시오

union Signal 
{ 
    struct 
    { 
     unsigned unit :2; 
     unsigned channel:2; 
     unsigned status :1; 
     unsigned group :1; 
     unsigned remote :26; 
    } parts; 
    unsigned long data; 
}; 

union Signal signal; 

void testPassingStruct(union Signal *variable) 
{ 
    variable->parts.status = 1; 
} 

void setup() 
{ 
    signal.parts.status = 1; 
    testPassingStruct(&signal); 
} 

void loop() 
{ 
} 
+0

그런 다음 signal.data를 사용하여 32 비트를 구성하는 5 개 부분을 반복 할 수 있습니까? 433Mhz 송신기를 통해 신호를 보내야합니다. – Tirithen

+1

예 - 실제로 시도하는 것보다 더 빨리 요청했을 것입니다. – cup