Массив объектов CPP с РАЗЛИЧНЫМИ параметрами конструктора - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть 8x датчики AM2301, которые я могу читать по отдельности, используя эту библиотеку DHT и пример кода, модифицированный по моему требованию. Это подразумевает необходимость делать что-то подобное для каждого датчика (что приводит к большому количеству повторяющихся кодов).

DHT dht(DHTPIN, DHTTYPE);
dht.begin();
float t,h;
t = dht.readTemperature();
h = dht.readHumidity();

Теперь я пытаюсь реорганизовать свой код, чтобы у меня был массив объектов DHT, которые я могу перебрать, чтобы объявить, инициализировать и прочитать значения (в массивы с плавающей точкой).

После проверки некоторых потоков в stackoverflow и т. Д. Я предложил две версии моего кода, которые компилируются.

Вот соответствующая часть моего кода. Весь исходный код (на основе PlatformIO) загружен здесь .

    SERIAL.print("Reading sensors: ");
    uint32_t startTime = millis();

    uint8_t SENSORS[] =  { PIN_SENSOR0, PIN_SENSOR1, PIN_SENSOR2, PIN_SENSOR3,
                           PIN_SENSOR4, PIN_SENSOR5, PIN_SENSOR6, PIN_SENSOR7 };

    SERIAL.println("INIT SENSORS");

    /* Please disregard this snippet. 
    // I was trying various things before posting here and messed up.
    DHT am2301[8];
    uint8_t i;
    for (i=0; i<8; i++){
      *am2301[i] = DHT(SENSORS[i], DHT_TYPE);
      am2301[i]->begin();
    }
    */

    // This locks up
    DHT **am2301;
    am2301 = new DHT* [8];
    uint8_t i;
    for (i=0; i<8; i++){
      am2301[i] = new DHT(SENSORS[i], DHT_TYPE);
      am2301[i]->begin();
    }

Однако оба эти стиля блокируют выполнение кода сразу после печати «INIT SENSORS». Целевая платформа ATSAMD21.

Я не являюсь опытным программистом на C / C ++, поэтому я могу что-то упустить или пропустить. Мне нужна помощь, чтобы понять, что я делаю неправильно, и если есть лучший способ сделать это.

РЕДАКТИРОВАТЬ: Используя vector, как рекомендовано в принятом ответе, я смог получить итеративный список объектов. Тем не менее, программа по-прежнему блокируется. Кажется, эта конкретная проблема связана с библиотекой DHT, которая не любит множественные динамические объекты. Теперь на github ...

1 Ответ

1 голос
/ 17 апреля 2019

c ++ предоставляет вам множество типов хранилищ объектов, чтобы помочь вам с такими вещами.Видение DHT **am2301; обычно можно заменить чем-то вроде std::vector, которое предназначено для того, чтобы быть вектором объектов.Если вы заявили, что это:

DHT dht(DHTPIN, DHTTYPE);
dht.begin();
float t = dht.readTemperature();

работает правильно, то вы можете легко создать вектор следующих типов чтения, например:

std::vector<DHT> am2301; // My vector
for (auto i = 0; i < 8; ++i) {
    am2301.emplace_back(SENSORS[i], DHT_TYPE); // Create the objects in place with the 
                                               // correct constructor arguments. std::vector
                                               // takes care of memory allocation.
    am2301[i].begin(); // Start the object
}

float t = am2301[5].readTemperature(); // Use the vector

Это избавит вас от необходимости помнитьудалите объекты позже, и это даст вам большую гибкость в использовании этого вектора.Использование таких типов - одна из самых мощных вещей в c ++, RAII .

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