【问题标题】:Passing a typedef enum as a parameter in c throwing error将 typedef 枚举作为参数传递给 c 抛出错误
【发布时间】:2017-06-29 23:04:17
【问题描述】:

我正在为 LPC1343 微控制器使用 cortex m3 编程。当我编译我的代码时,我在SetLed((eLeds_t *)h1, false); 行中出现错误,它显示Error[Pe018]: expected a ")",好像我所做的演员阵容不够好。

遵循枚举类型 def 声明和 :

#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

【问题讨论】:

  • 为什么要将枚举值转换为指针?
  • 您可以声明一个 eLeds_t 类型的局部变量并指定 h1。您可以将该变量的引用传递给函数。但是你为什么要这样做呢?
  • 我无法重现该错误。你确定你复制的代码正确吗?
  • 我得到的唯一警告是switch() 不能处理noled 的情况。
  • 真正的代码可能在某处缺少;

标签: c types syntax enums casting


【解决方案1】:

您正在将枚举(可能是一个像 0、1、2... 这样的值)转换为一个指针,然后您传递给它的方法期望取消引用指针并使用它所指向的内容?即使传递的语法是正确的(并且在语法上看起来确实没问题 - 如果不合理的话),它也会在取消引用时调用未定义的行为。

这将起作用:

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

所有这些都在 .h 中的事实是错误的。如果您从多个地方包含它,您将拥有多个定义的符号。

您对 bool 的处理是错误的。 #ifndef bool 只会在 bool 已定义散列的情况下使用。它不会拾取 typedef-ed bool。找出编译器有什么并使用它。在 C 中,通常定义 TRUE 和 FALSE (stdio.h?) - 使用它们。或者更好但不是布尔值。为什么不是动作枚举“PERFORM_ACTION”和“SKIP_ACTION”?这样你就不需要记住bool 应该是什么......

【讨论】:

  • 这并不能解释为什么他会遇到语法错误。他的真实代码中可能缺少;
  • John 我刚刚尝试过,但没有成功,我也检查了是否缺少分号,一切都在那里。
  • 错误不是简单的铸造东西。也许文件中(或其中一个包含)中存在问题? h1 是否定义为其他内容?从屏幕截图到 sn-p,缺少代码 - 问题可能出在某个地方。
  • 那在头文件里?这可能是你的第一个错误。您还必须查看它是从哪里包含的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
  • 2022-08-19
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多