Как объявить массив Arduino с пользовательским типом? - PullRequest
0 голосов
/ 28 сентября 2018

Я использую для своего проекта Arduino Библиотека OneWire и Даллас один .Этот тип определяет тип 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 голосов
/ 28 сентября 2018

Это не совсем пользовательский тип, это просто 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 ++.

Немного сложнее использовать контейнерный класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...