Помогите разобраться с областью видимости
- Войдите на сайт для отправки комментариев
Сб, 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 такое просто не работает без каких-либо ошибок
что я не понимаю в области видимости?
вот так
55MUX74HC4067 mux(_muxPinEN, _muxPin0, _muxPin1, _muxPin2, _muxPin3);5657Adafruit_ADS1115 ads(_adsAddress);5859_mux = &mux;60_ads = &ads;не делают, делают так
55_mux = newMUX74HC4067(_muxPinEN, _muxPin0, _muxPin1, _muxPin2, _muxPin3);5657_ads = newAdafruit_ADS1115(_adsAddress);58если уж ты создаешь класс динамически
Дело не в области видимости, иначе бы не откомпилировалось, дело в неправильном обращении, скорее всего. У тебя же переменные mux и ads уничножаются при выходе из begin(), они там локальные. Соответственно адреса их на выходе уже не имеют смысла. Работать будет до первого malloc().
Объекты mux и ads при выходе из функции begin уничтожаются, а указатели _mux и _ads продолжают указывать на те места в памяти, где объекты раньше находились.
DetSimen, спасибо, помогло:)