如何用自定义类型声明Arduino数组?

时间:2018-09-28 10:33:03

标签: c++ arrays arduino

我用于Arduino项目OneWire libraryDallas one。这定义了一种DeviceAddress类型,可以包含OneWire设备地址。我想创建一个数组来存储我的设备地址,因此可以在它们上循环。

以下内容无法编译

DeviceAddress waterTempSensorAddress = { 0x28, 0xCA, 0x98, 0xCF, 0x05, 0x0, 0x0, 0x51 };
DeviceAddress heatWaterSystemTemSensorAddress   = { 0x28, 0xC4, 0xA8, 0xCF, 0x05, 0x0, 0x0, 0xC6 };

DeviceAddress test[] = { waterTempSensorAddress, heatWaterSystemTemSensorAddress };

错误是:

pool_manager:62: error: array must be initialized with a brace-enclosed initializer DeviceAddress test[] = { waterTempSensorAddress, heatWaterSystemTemSensorAddress }; ^

是否可以为此声明一个类似Arduino的数组?我应该考虑使用其他结构吗?

谢谢

1 个答案:

答案 0 :(得分:0)

这不是真正的自定义类型,它只是typedef uint8_t DeviceAddress[8];,数组不能像类一样进行复制构造。

基本上,您可以通过两种简单的方法来做到这一点:

// #1
DeviceAddress test[] = { { 0x28, 0xCA, 0x98, 0xCF, 0x05, 0x0, 0x0, 0x51 }, { 0x28, 0xC4, 0xA8, 0xCF, 0x05, 0x0, 0x0, 0xC6 } };
// and eventually you can define:
DeviceAddress  *waterTempSensorAddress = test;
DeviceAddress  *heatWaterSystemTemSensorAddress = test + 1; 

但这不是很好。

另一种方法是使用指针:

// #2
DeviceAddress waterTempSensorAddress = { 0x28, 0xCA, 0x98, 0xCF, 0x05, 0x0, 0x0, 0x51 };
DeviceAddress heatWaterSystemTemSensorAddress   = { 0x28, 0xC4, 0xA8, 0xCF, 0x05, 0x0, 0x0, 0xC6 };
DeviceAddress * test2[] = { &waterTempSensorAddress, &heatWaterSystemTemSensorAddress };

第一个更易于使用,第二个更不易读:

void da(DeviceAddress const& addr) { /*  ....  */ }

void something() {
  da(test[0]);  // #1

  da(*(test2[0])); // #2 
  da(test2[0][0]); // #2 (it's basically two dimensional array of DeviceAddress)
}

无论如何,这都是关于C ++基础知识的。

更难的方法是使用容器类。