Помогите разобраться с областью видимости
- Войдите на сайт для отправки комментариев
Сб, 03/06/2017 - 00:28
Написал вот такой код:
MuxedADS.h
#ifndef MUXEDADS_H_ #define MUXEDADS_H_ //ADC #include "Adafruit_ADS1015.h" //Multiplexer #include "MUX74HC4067.h" class MuxedADS { private: //mux pins int8_t _muxPin0; int8_t _muxPin1; int8_t _muxPin2; int8_t _muxPin3; uint8_t _muxPinEN; uint8_t _adsAddress; adsGain_t _adsGain = GAIN_TWOTHIRDS; int8_t _muxPin; uint8_t _adsPin; MUX74HC4067* _mux; Adafruit_ADS1115* _ads; public: MuxedADS(uint8_t adsAddress, int8_t muxPin0, int8_t muxPin1, int8_t muxPin2, int8_t muxPin3, uint8_t muxPinEN, int virtPin); int16_t read(); void begin(); int16_t read(int8_t virt_pin); int16_t read(uint8_t ads_pin, int8_t mux_pin); void setGain(adsGain_t adsGain); }; #endif /* MUXEDADS_H_ */
MuxedADS.cpp
#include "Arduino.h" #include "MuxedADS.h" //ADC #include "Adafruit_ADS1015.h" //Multiplexer #include "MUX74HC4067.h" MuxedADS::MuxedADS(uint8_t adsAddress, int8_t muxPin0, int8_t muxPin1, int8_t muxPin2, int8_t muxPin3, uint8_t muxPinEN, int virtPin) { _adsAddress = adsAddress; _muxPin0 = muxPin0; _muxPin1 = muxPin1; _muxPin2 = muxPin2; _muxPin3 = muxPin3; _muxPinEN = muxPinEN; int divider = 16; uint8_t ads_pin = virtPin / divider; int8_t mux_pin = virtPin % divider; _muxPin = mux_pin; _adsPin = ads_pin; } //reads data by ads and mux pin int16_t MuxedADS::read(uint8_t ads_pin, int8_t mux_pin) { _muxPin = mux_pin; _adsPin = ads_pin; _mux->setChannel(mux_pin); return _ads->readADC_SingleEnded(ads_pin); } void MuxedADS::setGain(adsGain_t adsGain) { _ads->setGain(adsGain); } void MuxedADS::begin() { pinMode(_muxPin0, OUTPUT); pinMode(_muxPin1, OUTPUT); pinMode(_muxPin2, OUTPUT); pinMode(_muxPin3, OUTPUT); MUX74HC4067 mux(_muxPinEN, _muxPin0, _muxPin1, _muxPin2, _muxPin3); Adafruit_ADS1115 ads(_adsAddress); _mux = &mux; _ads = &ads; _mux->setChannel(_muxPin); _ads->begin(); _ads->setGain(_adsGain); }
соотвественно в основном коде я вызываю
MuxedADS mads(0x48, 2, 3, 4, 5, 22, 4); mads.begin(); Serial.println(mads.read(0, 4));
Вопрос такой: функция read не хочет работать, а именно объекты _ads и _mux недоступны в этой функции
при этом компилятор не выдает никаких ошибок
то есть если я например пишу прямо в функции begin
_mux->setChannel(_muxPin); Serial.println(_ads->readADC_SingleEnded(_adsPin));
то всё выполняется корректно - данные считываются
но в функции read такое просто не работает без каких-либо ошибок
что я не понимаю в области видимости?
вот так
55
MUX74HC4067 mux(_muxPinEN, _muxPin0, _muxPin1, _muxPin2, _muxPin3);
56
57
Adafruit_ADS1115 ads(_adsAddress);
58
59
_mux = &mux;
60
_ads = &ads;
не делают, делают так
55
_mux = new
MUX74HC4067(_muxPinEN, _muxPin0, _muxPin1, _muxPin2, _muxPin3);
56
57
_ads = new
Adafruit_ADS1115(_adsAddress);
58
если уж ты создаешь класс динамически
Дело не в области видимости, иначе бы не откомпилировалось, дело в неправильном обращении, скорее всего. У тебя же переменные mux и ads уничножаются при выходе из begin(), они там локальные. Соответственно адреса их на выходе уже не имеют смысла. Работать будет до первого malloc().
Объекты mux и ads при выходе из функции begin уничтожаются, а указатели _mux и _ads продолжают указывать на те места в памяти, где объекты раньше находились.
DetSimen, спасибо, помогло:)