Несколько дисплеев в классах

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

#include <Wire.h>
#include <LiquidCrystal_I2C.h>


class Cla {
  public:
    Cla(byte adr) {
      LiquidCrystal_I2C lcd(adr, 16, 2);
    }
    prin(){
      lcd.print("Hello, world!");
    }
};

Cla displ_1(0x3F);
Cla displ_2(0x27);

void setup() {
  displ_1.prin();
  displ_2.prin();
}
void loop() {
}

Возникает ошибка в методе.

ну раз ошибка секретная, чем мы можем помочь?

Тут ошибка в незнании области видимости переменных.

3 лайка

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

Вот здесь

дословно написано: “Создай объект дисплей 16х2 по адресу adr, и тут же выбрось этот объект и забудь о нём, он мне не нужен, я просто по приколу его создавал, так что выбрось и освободи память”.

А вот здесь вообще непонятно что написано.

Кто-нибудь может сказать где, когда и при каких обстоятельствах был создан объект lcd, к которому здесь пытаются обратиться? По мне так нигде и никогда он не создавался.

Вы не знаете языка на котором пишете, и потому пишете совсем не то, что, по-видимому, хотели написать.

3 лайка

Тебе не нужно несколько дисплеев в одном устройстве. Если нужно, то в 99% случаев это должны быть несколько устройств. Это универсальное правило.

Кстати, раз уж появился такой пример, вопрос - это Ардуино ИДЕ разрешает так не указывать тип возвращаемого значения ?
Просто им (ИДЕ) не пользуюсь.

Спасибо всем кто откликнулся.

Ошибка не секретная.

In member function ‘void Cla::prin()’:
error: ‘lcd’ was not declared in this scope

Да действительно. Я посчитал, что это конструктор класса и этого достаточно. Но lcd надо было объявить раньше в классе.

Нет не разрешает. Это опечатка там нужен void. Уже исправил.

Недостаточно.

Не поможет.

Пока Вы будете читать “про конструктор класса” а не про язык целиком, у Вас ничего не получится. Вы не знаете элементарных основ, а пытаетесь выразить достаточно сложные смыслы.

Нашел хороший пример

#include <Wire.h>
#include <LiquidCrystal_I2C.h>


class Cl_AAA {
  public:
    LiquidCrystal_I2C *lcd;
    Cl_AAA() {
      lcd = new LiquidCrystal_I2C(0x3F, 16, 2);
    }
} AAA;
void setup() {
}
void loop() {
}

Изменил

#include <Wire.h>
#include <LiquidCrystal_I2C.h>


class Cl_AAA {
  public:
    LiquidCrystal_I2C *lcd;
    Cl_AAA(byte adr) {
      lcd = new LiquidCrystal_I2C(adr, 16, 2);
    }
    void prin() {
      lcd.print("Hello, world!");
    }
};

Cl_AAA aaa(0x3F);

void setup() {
}
void loop() {
}

Но метод print используется все ровно не верно.
Ошибка:
In member function ‘void Cl_AAA::prin()’:
error: request for member ‘print’ in ‘((Cl_AAA*)this)->Cl_AAA::lcd’, which is of pointer type ‘LiquidCrystal_I2C*’ (maybe you meant to use ‘->’ ?)

Чувак, тебе прямым текстом по англ пишут в чем твой косяк, переведи хоть в гугле, че ты хочешь от нас-то?

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

С Вашим принтом проблем никаких, напишите там:

lcd->print("Hello, world!");

делов-то.

Только без знания языка Вам это не поможет, это только до следующего затыка.

2 лайка

Да язык целиком не знаю. Учусь в основном на рабочих примерах. Это моё хобби. Программирование не является моей основной деятельностью. Возвращаюсь к написанию по мере появления свободного времени.

Это не той сложности система, которой можно научиться на примерах.

Так и я о том же! Либо Вы изучаете язык, либо побираетесь на форумах за каждой запятой. Через пару-тройку таких обращений, Вас просто будут посылать “на”, поскольку это уже не помощь желающему научиться, а написание каждой строчки за ленивую задницу.

1 лайк

Учиться на при мерах - хобби? Как по мне то хобби на то и хобби что бы знать его не хуже чем работу, какой в нем тогда смысл?

Спасибо, тебе добрый человек.
Все, заработало.
Теперь код выглядит так:

class Cl_AAA {
  public:
    LiquidCrystal_I2C *lcd;
    Cl_AAA(byte adr) {
      lcd = new LiquidCrystal_I2C(adr, 16, 2);
    }
    void prin() {
      lcd->print("Hello, world!");
    }
};

Cl_AAA disp_1(0x3F);
Cl_AAA disp_2(0x27);

void setup() {
  disp_1.prin();
  disp_2.prin();
}
void loop() {
}

Вообще, вам возможно это не интересно. Но программа в которой я хотел использовать такой способ написана мной и работает без способа вызова метода класса из класса. Я просто хотел ее изменить. А ума не хватает. Эта программа для вывода текста и чисел на дисплеи TM1637 с использованием библиотеки ErriezTM1637. Хочу применить для беговой дорожки. Беговая дорожка уже работает с применением ПИД регулятора, только без вывода скорости, дистанции.

Всем спасибо.

Вообще-то, принято отмечать пометкой “Вопрос решён” , тот пост, который максимально помог в решении Вашего вопроса

интересно, а какая у человека основная деятельность :thinking:

Инженер-энергетик.

Не за что.

Да и не за то благодарите. Благодарности тут стоит совет книжку почитать, а не заменить точку на стрелку.

1 лайк