【问题标题】:Compiler error initializing array of structs in C (array must be initialized with a brace-enclosed initializer)编译器错误初始化 C 中的结构数组(数组必须用大括号括起来的初始化程序初始化)
【发布时间】:2016-02-15 01:34:13
【问题描述】:

编译器错误“错误:数组必须用大括号括起来的初始化程序初始化”让我很困惑。这个问题的其他例子似乎都与此无关。我大约有 14 年没接触过 C 语言了,所以我觉得“锈”这个词有点大方。我确定我只是错过了一些愚蠢的事情。

typedef uint8_t DeviceAddress[8];
DeviceAddress Probe01 = { 0x28, 0xFF, 0x87, 0x5A, 0x91, 0x15, 0x04, 0xE0 }; 
DeviceAddress Probe02 = { 0x28, 0xFF, 0x97, 0x5E, 0x91, 0x15, 0x04, 0x92 };
DeviceAddress Probe03 = { 0x28, 0xFF, 0xCD, 0x81, 0x91, 0x15, 0x01, 0x1E };
DeviceAddress Probe04 = { 0x28, 0xFF, 0xA6, 0x69, 0x91, 0x15, 0x04, 0x15 };
DeviceAddress Probe05 = { 0x28, 0xFF, 0xD8, 0x7E, 0x91, 0x15, 0x04, 0x64 };

struct DeviceInfo {
  DeviceAddress addr;
  const char * name;
};

struct DeviceInfo devices[5] = {
  {.addr = Probe01, .name = "Pump1"},
  {.addr = Probe02, .name = "Pump2"},
  {.addr = Probe03, .name = "Pump3"},
  {.addr = Probe04, .name = "Pump4"},
  {.addr = Probe05, .name = "Pump5"}
};

【问题讨论】:

  • 你不能通过赋值复制一个数组,即使它的类型是通过 typedef 别名的。所以初始化器.addr = Probe01 无效。
  • 除了devices 表之外,您是否需要Probe01 等作为单独的数组存在,或者您是否只是将它们声明为帮助器以使表更整洁?
  • 多年的 Python 和 Java 让我心烦意乱(也许无法修复)。谢谢大家的帮助。由于使用 Probe0X 对代码的可读性没有太大的增强,然后将该变量与名称配对,我只是按照示例进行操作: {.addr = { 0x28, 0xFF, 0x87, 0x5A, 0x91, 0x15, 0x04, 0xE0 } , .name = "Pump1" }.

标签: c arrays


【解决方案1】:
struct DeviceInfo devices[5] = {
  {.addr = Probe01, .name = "Pump1"},
  {.addr = Probe02, .name = "Pump2"},
  {.addr = Probe03, .name = "Pump3"},
  {.addr = Probe04, .name = "Pump4"},
  {.addr = Probe05, .name = "Pump5"}
};

这里,addrDeviceAddress 类型,它只是一个 uint8_t 数组。您不能在 C 中分配给数组,因此编译器告诉您将 Probe1 分配给字段 addr 是无效的;它需要有自己的大括号括起来的数组初始化器。

您有几个选择。您可以完全摆脱 Probe01Probe02 等,只需按照编译器的建议初始化数组:

struct DeviceInfo devices[5] = {
  {.addr = { 0x28, 0xFF, 0x87, 0x5A, 0x91, 0x15, 0x04, 0xE0 }, .name = "Pump1" },
  ...
};

另一个有点迂回的选择是有两个 typedef:

typedef uint8_t DeviceAddress[8];
typedef uint8_t * DeviceAddress_P;

struct DeviceInfo {
  DeviceAddress_P addr;
  const char * name;
};

并在结构中使用指针类型,将其初始化为指向您创建的数组的第一个元素:

DeviceAddress Probe01 = { 0x28, 0xFF, 0x87, 0x5A, 0x91, 0x15, 0x04, 0xE0 };

struct DeviceInfo devices[5] = {
  {.addr = Probe01, .name = "Pump1"},
  ...
};

但是,这样一来,struct 只是指向一个外部数组,这可能是不可取的。

【讨论】:

    【解决方案2】:

    如果您按照@M.M 的要求将“Probe0x”用作帮助更清楚地思考,您可以将 Struct DeviceInfo 类型的数组设备初始化为休闲:

    struct DeviceInfo devices[5] = {
      {{ 0x28, 0xFF, 0x87, 0x5A, 0x91, 0x15, 0x04, 0xE0 }, "Pump1"},
      {{ 0x28, 0xFF, 0x97, 0x5E, 0x91, 0x15, 0x04, 0x92 }, "Pump2"},
      {{ 0x28, 0xFF, 0xCD, 0x81, 0x91, 0x15, 0x01, 0x1E }, "Pump3"},
      {{ 0x28, 0xFF, 0xA6, 0x69, 0x91, 0x15, 0x04, 0x15 }, "Pump4"},
      {{ 0x28, 0xFF, 0xD8, 0x7E, 0x91, 0x15, 0x04, 0x64 }, "Pump5"}
    };
    

    【讨论】:

      猜你喜欢
      • 2011-05-18
      • 1970-01-01
      • 1970-01-01
      • 2021-07-18
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 2013-08-23
      • 2013-10-09
      相关资源
      最近更新 更多