2017-06-29 85 views
-2

我正在为LPC1343微控制器编程一个皮层m3。当我编译我的代码时,我得到一行SetLed((eLeds_t *)h1, false);错误,它说Error[Pe018]: expected a ")"好像这个演员我做的不够好,我猜。传递一个typedef枚举作为c参数抛出错误

遵循枚举类型定义声明和:

#ifndef _LEDS_h 
#define _LEDS_h 

#ifndef bool 
typedef unsigned char bool; 
# define true 1; 
# define false 0; 
#endif // ifndef bool 

enum eLeds 
{ 
    noled, p1l, p1r, p2l, p2r, h1, h2 
}; 
typedef enum eLeds eLeds_t; 

void SetLed(eLeds_t led, bool action) 
{ 
    switch (led) 
    { 
    case p1l: 
     GPIOSetValue(PORT2, 5, action); 
     break; 

    case p1r: 
     GPIOSetValue(PORT2, 8, action); 
     break; 

    case p2l: 
     GPIOSetValue(PORT0, 9, action); 
     break; 

    case p2r: 
     GPIOSetValue(PORT0, 8, action); 
     break; 

    case h1: 
     GPIOSetValue(PORT0, 5, action); 
     break; 

    case h2: 
     GPIOSetValue(PORT0, 7, action); 
     break; 
    } 
} 

void leds_init(void) 
{ 
    GPIOSetDir(PORT2, 5, 1); // p1l 
    GPIOSetDir(PORT2, 8, 1); // p1r 
    GPIOSetDir(PORT0, 9, 1); // p2l 
    GPIOSetDir(PORT0, 8, 1); // p2r 

    GPIOSetDir(PORT0, 5, 1); // h1 
    GPIOSetDir(PORT0, 7, 1); // h2 

    LPC_IOCON->PIO2_5 &= ~0x07; 
    LPC_IOCON->PIO2_8 &= ~0x07; 
    LPC_IOCON->PIO0_9 &= ~0x07; 
    LPC_IOCON->PIO0_8 &= ~0x07; 

    LPC_IOCON->PIO0_5 &= ~0x07; 
    LPC_IOCON->PIO0_7 &= ~0x07; 

    eLeds_t value = h1; 
    SetLed(&value, false); 
} 

#endif // ifndef _LEDS_h 

enter image description here

+2

你为什么将枚举值转换为指针? – Barmar

+1

您可以声明eLeds_t类型的本地并分配该“h1”。您可以将该变量的引用传递给函数。但你为什么要这么做? – MKR

+1

我无法重现该错误。你确定你正确地复制了代码吗? – Barmar

回答

1

您是铸造枚举(大概是这样值为0,1,2 ...)的指针,然后你传递的方法希望取消引用指针并使用它指向的内容?即使通过的语法是正确的(它看起来在语法上没问题 - 如果不是合理的话),它将在解引用上调用未定义的行为。

这将工作:

void leds_init(void) 
{ 
    eLeds_t value = h1; 
    SetLed(&value, false); 
} 

事实上,所有这一切都是在.h是错误的。如果你从多个地方包含它,你会有多个定义的符号。

您对bool的处理是错误的。 #ifndef bool只会在bool被哈希定义时才会启动。它不会选择一个typedef-ed布尔。找出编译器的内容并使用它。在C中,TRUE和FALSE通常被定义(stdio.h?) - 使用这些。或者更好,但不是一个布尔。为什么不动作枚举“PERFORM_ACTION”和“SKIP_ACTION”?这样,你不需要记得bool应该是什么......

+0

这并不能解释他为什么会出现语法错误。在他的真实代码中可能缺少';'。 – Barmar

+0

John我刚刚尝试过,它没有工作,我也检查了缺失的分号,它就在那里。 –

+0

@RinaldiSegecin定义“没有工作” – John3136