РЕШЕНО Проблема двух приватных массивов в классе.

Тема в разделе "Arduino & Shields", создана пользователем WhiteFox, 27 фев 2021.

Метки:
  1. WhiteFox

    WhiteFox Нерд

    Есть 2 приватных массива _digitalPins и _analogPins в классе Control_LightSensor.
    Конструктор класса принимает массивы digitalPins и analogPins, которые копируются
    в _digitalPins и _analogPins, а когда я перебираю эти массивы, то оказывается что они одинаковые...
    Как это исправить?

    Код (C++):
    #pragma once
    #include <Arduino.h>

    class Control_LightSensor {
        static byte getRangeLight(unsigned int input);

      public:
        Control_LightSensor(byte digitalPins[], byte analogPins[], byte countDigitalPins, byte countAnalogPins, unsigned int setting = 85);
        byte getResult(byte pin);
        byte getCountDigitalPins();
        byte getCountAnalogPins();
        byte getCountSensor();
        byte getMaxCountSensor();

      private:
        byte _countDigitalPins, _countAnalogPins, _setting, _maxCountSensor;
        byte _digitalPins[], _analogPins[];
    };

    Control_LightSensor::Control_LightSensor(byte digitalPins[], byte analogPins[], byte countDigitalPins, byte countAnalogPins, unsigned int setting = 85) {
      _setting = setting;
      _countDigitalPins = countDigitalPins;
      _countAnalogPins = countAnalogPins;
      _maxCountSensor = _countAnalogPins * _countDigitalPins;
      _digitalPins[countDigitalPins];
      for (byte index = 0; index < countDigitalPins; index++) {
        _digitalPins[index] = digitalPins[index];
        pinMode(digitalPins[index], OUTPUT);
      }
      _analogPins[countAnalogPins];
      for (byte index = 0; index < countAnalogPins; index++) {
        _analogPins[index] = analogPins[index];
        pinMode(analogPins[index], INPUT);
      }
    }

    byte Control_LightSensor::getResult(byte pin) {
      pin -= 1;
      byte pin1, pin2;
      pin1 = _digitalPins[pin % _countDigitalPins];
      pin2 = _analogPins[(byte)floor(pin / _countDigitalPins)];
      byte part;
      digitalWrite(pin1, HIGH);
      unsigned int input = analogRead(pin2);
      digitalWrite(pin1, LOW);
      for (part = 100; ((_setting + (((1024.0 - _setting) / 10000.0) * (part * part))) > input) && (part > 0); part--);
      return part;
    }

    byte Control_LightSensor::getCountSensor() { //работает только с полностью собранной схемой!
      byte countSensor, pin1, pin2;
      countSensor = 0;
      for (byte pin = 0; pin < _maxCountSensor; pin++) {
        pin1 = _analogPins[(byte)floor(pin / _countDigitalPins)];
        if (analogRead(pin1) == 0) {
          pin2 = _digitalPins[pin % _countDigitalPins];
          digitalWrite(pin2, HIGH);
          countSensor += analogRead(pin1) == 0 ? 0 : 1;
          digitalWrite(pin1, LOW);
        }
      }
      return countSensor;
    }
     
  2. Un_ka

    Un_ka Гуру

    Т.е. каждый элемент первого равен элементу второго?
    А как вы это узнали, если они приватные?
    Покажите, пожалуйста, код, где вы это делаете.
     
  3. WhiteFox

    WhiteFox Нерд

    Создал публичный метод в классе и вызвал...

    Код (C++):
    void Control_LightSensor::print() {
      for(byte index = 0; index < _countAnalogPins; index++){
        Serial.print(_analogPins[index]);
        Serial.print(" ");
      }
      Serial.println();
      for(byte index = 0; index < _countDigitalPins; index++){
        Serial.print(_digitalPins[index]);
        Serial.print(" ");
      }
      Serial.println();
    }
     
  4. Un_ka

    Un_ka Гуру

    Попробуйте передавать массивы в конструктор класса с помощью указателей.
    Дебагером бы покопаться...
     
  5. AlexU

    AlexU Гуру

    Внутри класса массивы не инициализированы. В результате работы конструктора, будет повреждена память за пределами экземпляра класса.
     
    WhiteFox и Asper Daffy нравится это.
  6. WhiteFox

    WhiteFox Нерд

    И как их правильно инициализировать в моем случае? Мне нужны приватные массивы, которым я задаю размер при исп. конструктора.
     
  7. AlexU

    AlexU Гуру

    Один из вариантов -- динамическое выделение памяти -- new/delete.
    Но в случае с микроконтроллерами с малым объёмом ОЗУ, этим нужно пользоваться предельно аккуратно.
    Есть и другие варианты, но они зависят от логики прошивки в целом.
     
    WhiteFox нравится это.
  8. Asper Daffy

    Asper Daffy Иксперд

    Да, чего копаться, если он в классе под этим массивы память не выделяет? Избаловались вы, ребята, с дебагерами.
     
  9. Asper Daffy

    Asper Daffy Иксперд

    Так и задавайте. Вы ж не задаёте!
     
  10. WhiteFox

    WhiteFox Нерд

    Спасибо, помог уцепиться за нужную нить...
    Решил.

    Код (C++):
    #pragma once
    #include <Arduino.h>

    class Control_LightSensor {

      public:
        Control_LightSensor(byte *digitalPins, byte *analogPins, byte countDigitalPins, byte countAnalogPins, unsigned int setting = 85);
        byte getResult(byte pin);
        byte getCountDigitalPins();
        byte getCountAnalogPins();
        byte getCountSensor();
        byte getMaxCountSensor();
        void print();

      private:
        byte _countDigitalPins, _countAnalogPins, _setting, _maxCountSensor;
        byte *_digitalPins, *_analogPins;
    };

    Control_LightSensor::Control_LightSensor(byte *digitalPins, byte *analogPins, byte countDigitalPins, byte countAnalogPins, unsigned int setting = 85) {
      _setting = setting;
      _countDigitalPins = countDigitalPins;
      _countAnalogPins = countAnalogPins;
      _maxCountSensor = countAnalogPins * countDigitalPins;
      _digitalPins = new byte[countDigitalPins];
      _analogPins = new byte[countAnalogPins];
      for (byte index = 0; index < _countDigitalPins; index++) {
        _digitalPins[index] = digitalPins[index];
        pinMode(digitalPins[index], OUTPUT);
      }
      for (byte index = 0; index < _countAnalogPins; index++) {
        _analogPins[index] = analogPins[index];
        pinMode(analogPins[index], INPUT);
      }
    }
     
     
  11. Un_ka

    Un_ka Гуру

    Я и без них как-то умудрился залезать за размеры массива, и потом долго искал ошибку, греша на EEPROM.

    А если использовать vector?
     
  12. Asper Daffy

    Asper Daffy Иксперд

    А экземпляры всегда статические? И всегда живут до скончания века? А то необходим деструктор в котором бы эта память освобождалась. Также, планируется ли присваивать экземпляры друг другу? Если да, то нужно определять оператор присваивания.
     
    Un_ka нравится это.