2012-08-08 54 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) 

這是有問題的行

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

這是警告

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)') 

有沒有人有任何想法爲什麼發生這種情況?我是否錯誤地將PWM *結構嵌入到PIN結構中?

回答

0

簡答:是的。

取代具有指針,你應該直接使用結構:

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

而且,你不需要做鑄造:

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

我最初試圖說,但有一些情況下,將不會有一個PWM,所以我需要能夠將其設置爲NULL。如果它不是指針,那麼我可以如何使它在可能存在NULL PWM的情況下工作? – 2012-08-08 19:03:40

+0

好吧,我基本上添加了一個標誌PIN密碼pwm_present,並將其設置爲true或false,所以我不必直接對PIN進行邏輯測試.plm - 謝謝! – 2012-08-08 19:37:44

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

的標記部分是不一個指針。

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

讓我知道是否需要更多解釋。 – 2012-08-10 07:29:44

+0

這會有更多的開銷,使用宏來創建結構的實例嗎?有些情況下,從不使用引腳。我不知道,但它看起來像在gpio.c中,這將爲每個引腳創建一個結構,如果從未使用過,會浪費內存。 – 2012-08-11 14:51:18