Есть 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; }
Т.е. каждый элемент первого равен элементу второго? А как вы это узнали, если они приватные? Покажите, пожалуйста, код, где вы это делаете.
Создал публичный метод в классе и вызвал... Код (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(); }
Внутри класса массивы не инициализированы. В результате работы конструктора, будет повреждена память за пределами экземпляра класса.
И как их правильно инициализировать в моем случае? Мне нужны приватные массивы, которым я задаю размер при исп. конструктора.
Один из вариантов -- динамическое выделение памяти -- new/delete. Но в случае с микроконтроллерами с малым объёмом ОЗУ, этим нужно пользоваться предельно аккуратно. Есть и другие варианты, но они зависят от логики прошивки в целом.
Да, чего копаться, если он в классе под этим массивы память не выделяет? Избаловались вы, ребята, с дебагерами.
Спасибо, помог уцепиться за нужную нить... Решил. Код (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); } }
Я и без них как-то умудрился залезать за размеры массива, и потом долго искал ошибку, греша на EEPROM. А если использовать vector?
А экземпляры всегда статические? И всегда живут до скончания века? А то необходим деструктор в котором бы эта память освобождалась. Также, планируется ли присваивать экземпляры друг другу? Если да, то нужно определять оператор присваивания.