2012-08-08 58 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