Помогите разобраться с областью видимости

Hamulus
Offline
Зарегистрирован: 24.08.2015

Написал вот такой код:

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 такое просто не работает без каких-либо ошибок

что я не понимаю в области видимости?

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

вот так

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().

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Объекты mux и ads при выходе из функции begin уничтожаются, а указатели _mux и _ads продолжают указывать на те места в памяти, где объекты раньше находились.

Hamulus
Offline
Зарегистрирован: 24.08.2015

DetSimen, спасибо, помогло:)