初始化C中结构的数组时出现编译器错误(数组必须用大括号内的初始值设定项初始化)

初始化C中结构的数组时出现编译器错误(数组必须用大括号内的初始值设定项初始化),c,arrays,C,Arrays,我被编译器错误“error:array必须用括号内的初始值设定项初始化”难住了。这个问题的其他例子似乎都与此无关。我已经14年没有接触过C了,所以我觉得“锈迹”这个词有点宽泛。我肯定我错过了一些愚蠢的事情 typedef uint8_t DeviceAddress[8]; DeviceAddress Probe01 = { 0x28, 0xFF, 0x87, 0x5A, 0x91, 0x15, 0x04, 0xE0 }; DeviceAddress Probe02 = { 0x28, 0xFF

我被编译器错误“error:array必须用括号内的初始值设定项初始化”难住了。这个问题的其他例子似乎都与此无关。我已经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"}
};
这里,
addr
属于
DeviceAddress
类型,它只是一个
uint8\t
数组。您不能在C中分配到数组中,因此编译器告诉您将
Probe1
分配到
addr
字段是无效的;它需要自己的括号括起来的数组初始值设定项

你有两个选择。您可以完全删除
Probe01
Probe02
等,只需按照编译器的建议初始化数组即可:

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"},
  ...
};
但是,通过这种方式,结构只指向外部数组,这可能是不可取的

这里,
addr
属于
DeviceAddress
类型,它只是一个
uint8\t
数组。您不能在C中分配到数组中,因此编译器告诉您将
Probe1
分配到
addr
字段是无效的;它需要自己的括号括起来的数组初始值设定项

你有两个选择。您可以完全删除
Probe01
Probe02
等,只需按照编译器的建议初始化数组即可:

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"},
  ...
};
但是,通过这种方式,结构只指向一个外部数组,这可能是不可取的。

如果您使用“Probe0x”作为助手,以便按照@M.M的要求更清楚地思考问题,您可以将struct DeviceInfo类型的数组设备初始化为fallow:

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"}
};
如果按照@M.M的要求使用“Probe0x”作为帮助工具以使思考更清晰,则可以将Struct DeviceInfo类型的数组设备初始化为fallow:

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"}
};

不能通过赋值复制数组,即使其类型通过typedef具有别名。因此initialiser
.addr=Probe01
无效。除了
设备
表之外,您是否需要
Probe01
等作为单独的数组存在,或者您只是将它们声明为帮助工具以使表更整洁?多年的Python和Java让我头脑混乱(可能无法修复)。谢谢大家的帮助。由于使用Probe0X并将该变量与名称配对,代码的可读性没有太大的增强,因此我只是遵循以下示例:{.addr={0x28,0xFF,0x87,0x5A,0x91,0x15,0x04,0xE0},.name=“Pump1”}。您无法通过赋值复制数组,即使其类型通过typedef别名。因此initialiser
.addr=Probe01
无效。除了
设备
表之外,您是否需要
Probe01
等作为单独的数组存在,或者您只是将它们声明为帮助工具以使表更整洁?多年的Python和Java让我头脑混乱(可能无法修复)。谢谢大家的帮助。由于使用Probe0X并将该变量与名称配对,代码的可读性没有太大的增强,所以我只是遵循以下示例:{.addr={0x28,0xFF,0x87,0x5A,0x91,0x15,0x04,0xE0},.name=“Pump1”}。