2012-08-08 11 views
0

헤더 파일에 저장해야하는 많은 양의 상수 데이터가 있습니다. 데이터의 본질 (중첩 된 방식) 때문에 전 처리기로 초기화 된 구조체를 사용하기로 결정했습니다. 프리 프로세서 초기화 구조체

나는과 같이 이러한 구조체를 초기화하는 것을 시도하고있다 :

typedef struct s_PWM { 
    uint8_t muxmode; 
    char *name; 
    char *path; 
} PWM; 

typedef struct s_PIN { 
    char *name; 
    uint8_t gpio; 
    char *mux; 
    uint8_t eeprom; 
    PWM *pwm; 
} PIN; 

이 날, 어떤 의미에서, 적절한 속성을 가지는 구조체를 조립하는

PIN p1 = P8_19; 

처럼 뭔가를 할 수있다.

기본적으로, 당신은 함수에 핀을 보낼 수 있습니다

pinMode(P8_19, OUTPUT) 

이이

src/gpio.c:50:2: warning: excess elements in scalar initializer 
src/gpio.c:50:2: warning: (near initialization for '(anonymous)') 
src/gpio.c:50:2: warning: excess elements in scalar initializer 
src/gpio.c:50:2: warning: (near initialization for '(anonymous)') 

사람이 어떤 아이디어가 있습니까 경고에게 있습니다

#define P8_19 ((PIN){"EHRPWM2A", 22, "gpmc_ad8", 14, (PWM*){4, "EHRPWM2A", "ehrpwm.2:0"}}) 

문제의 라인입니다 왜 이런 일이 일어 났습니까? PIN 구조체에 PWM 구조체를 잘못 중첩 시켰습니까?

답변

0

짧은 대답 : 예.

대신 포인터를 가진 당신이 직접 구조를 사용해야합니다

#define P8_19 {"EHRPWM2A", 22, "gpmc_ad8", 14, {4, "EHRPWM2A", "ehrpwm.2:0"}} 
+0

처음에 그걸 시도했지만, PWM이 없을 경우가 있기 때문에 NULL로 설정할 필요가 있습니다. 포인터가 아닌 경우 NULL PWM이있을 수있는 곳에서 어떻게 작동합니까? –

+0

좋아요, 기본적으로 PIN pwm_present에 플래그를 추가하고이를 true 또는 false로 설정하여 PIN.pwm에 대해 직접 논리적 테스트를 수행 할 필요가 없습니다. - 감사합니다! –

0
#define P8_19 ((PIN){"EHRPWM2A", 22, "gpmc_ad8", 14, (PWM*){4, "EHRPWM2A", "ehrpwm.2:0"}}) 
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

표시된 부분은되지 않습니다 : 또한

typedef struct s_PIN { 
    char *name; 
    uint8_t gpio; 
    char *mux; 
    uint8_t eeprom; 
    PWM pwm; /* Notice: not a pointer */ 
} PIN; 

을, 당신은 캐스팅을 할 필요가 없습니다 포인터.

0

이 문제는 약간 다르게 처리됩니다. 다음과 같이 자신의 모듈에 핀 이름을 정의합니다.

gpio.h

:

typedef struct s_PWM { 
    uint8_t muxmode; 
    char *name; 
    char *path; 
} PWM; 

typedef struct s_PIN { 
    char *name; 
    uint8_t gpio; 
    char *mux; 
    uint8_t eeprom; 
    PWM *pwm; 
} PIN; 

... 
extern PIN * P8_19; 

gpio.c :

PWM _P8_19_PWM = {4, "EHRPWM2A", "ehrpwm.2:0"}; 
PIN _P8_19  = {"EHRPWM2A", 22, "gpmc_ad8", 14, &_P8_19_PWM}; 
PIN *P8_19  = &_P8_19; 

은 그럼 당신은 gpio.h을 포함하여 일반적 P8_19을 사용하여 다른 파일을 참조 할 수 있습니다.

+0

자세한 설명이 필요한지 알려주세요. –

+0

매크로를 사용하여 구조체의 인스턴스를 만드는 데 오버 헤드가 더 많이 발생합니까? 핀을 사용하지 않는 경우가 있습니다. 모르겠지만, gpio.c처럼 보일 것입니다. 이것은 각 핀에 대한 구조체를 생성 할 것이고, 결코 사용되지 않는다면 메모리를 낭비 할 것입니다. –