Устранение неполадок в простом классе Arduino

0

Я пытаюсь получить простую библиотеку классов для работы в Arduino и боюсь.

Библиотека -.h

#ifndef ADS1X15_h
#define ADS1X15_h

#include "Arduino.h"

class ADS1X15
{
    protected:

    public:
        ADS1X15     ();
        void        begin(uint8_t i2cAddress);
        uint8_t     m_i2cAddress;
        uint8_t     m_test;

    private:
};

#endif

Библиотека.cpp

#include "Arduino.h"
#include "ADS1X15.h"

ADS1X15::ADS1X15() {
    uint8_t     m_i2cAddress;
    uint8_t     m_test = 99;
}

void ADS1X15::begin(uint8_t i2cAddress) {
    uint8_t     m_i2cAddress = i2cAddress;
}

Вызов эскиза

#include <ADS1X15.h>

ADS1X15 ads; 

void setup(void) {
    Serial.begin(9600);
    ads.begin(66);
}

void loop(void) {
    Serial.print("Test1 ");
    Serial.println(ads.m_i2cAddress);
    Serial.print("Test2 ");
    Serial.println(ads.m_test);  
    while (1==1) {}
}

Кажется, что выше было напечатать 99 и 66 вместо 0 и 0!?!?!

Заранее спасибо.

Теги:
class
arduino

2 ответа

1
Лучший ответ

Это неверно:

ADS1X15::ADS1X15() {
    uint8_t     m_i2cAddress;
    uint8_t     m_test = 99;
}

Он объявляет две локальные переменные конструктору, которые соответствуют именам ваших членов класса. У вас аналогичная ошибка в ADS1X15::begin. Если у вас есть предупреждения, вы должны получить предупреждение о локальной переменной, затеняющей переменную-член или аналогичную.

Перепишите те, у которых нет объявлений типов, и они обновят ваш класс вместо обновления локальных переменных.

ADS1X15::ADS1X15() {
    m_test = 99;
}

void ADS1X15::begin(uint8_t i2cAddress) {
    m_i2cAddress = i2cAddress;
}
  • 0
    Это делает трюк. Не уверен, о чем я думал или на какой пример смотрел и не видел этого.
1

В вашем cpp:

ADS1X15::ADS1X15() {
    uint8_t     m_i2cAddress;
    uint8_t     m_test = 99;

вы обновляете публичные элементы, поэтому, когда вы ссылаетесь на внутренний конструктор, вы получаете закрытую копию вместо публичных членов класса.

Просто используйте:

ADS1X15::ADS1X15() {
    m_test = 99;
}

void ADS1X15::begin(uint8_t i2cAddress) {
    m_i2cAddress = i2cAddress;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню