Объект одного класса включает в себя четыре объекта другого класса.

valeryich
Offline
Зарегистрирован: 29.02.2020

Пожалуйста, помогите начинающему программисту.
Создаю объект "панель оператора", нужно включить в него четыре кнопки, принадлежащие другому классу.
Хочу инициализировать четыре объекта кнопок (прописывать пины) в одной строчке.
Компилятор ругается.
Код:

class Button4 {  // панель оператора
    public:
        boolean pressEsc = false;  // true - если кнопка нажата
        boolean pressDec = false;
        boolean pressInc = false;
        boolean pressEnter = false; 
..................................................
Button::Button (byte esc_pin,byte dec_pin,byte inc_pin,byte enter_pin,byte period) { 
  ButtonSerge button_Esc(esc_pin,period);  // создаю объекты - кнопки
  ButtonSerge button_Dec(dec_pin,period);
  ButtonSerge button_Inc(inc_pin,period);
  ButtonSerge button_Enter(enter_pin,period);
}

Если создавать кнопки не в конструкторе, то где?

rkit
Offline
Зарегистрирован: 23.11.2016

Прочитать что компилятор пишет не пробовал?

valeryich
Offline
Зарегистрирован: 29.02.2020

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

rkit
Offline
Зарегистрирован: 23.11.2016

Нет, ты попробуй все-таки прочитать, а не "варианты".

valeryich
Offline
Зарегистрирован: 29.02.2020

Я создаю объекты 

ButtonSerge button_Esc(esc_pin,period);  // создаём объекты "кнопки"

в описании конструктора класса Button4

При вызове конструктора   

Button4 but4(12,11,10,9,20); // создаём объект из четырёх кнопок ESC,DEC,INC,ENTER компилятор сообщает, что эти объекты (кнопки) не описаны.
Я их описал не в том месте и не так.
Я возвращаюсь к своему первому вопросу: 
Где и как я должен заявлять объекты "кнопки"?

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

valeryich,

для начала, вставьте код правильно.

Пока Вы этого не сделаете его никто читать не будет!

Вставьте, объясните толком проблему, тогда и поговорим.

b707
Offline
Зарегистрирован: 26.05.2017

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

Модераторы, прошу зачистить ветку. Можно вместе с автором, если будет выступать.

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

valeryich пишет:

Вот перевод ответа:

Вы смеётесь? Кому и нахрена нужен покоцанный перевод?

Сообщения выкладываете копи-пастом - как они есть, полностью!

Код тоже полностью.

Используемую библиотеку - тоже или ссылку даёте (откуда нам её знать).

Только так.

valeryich
Offline
Зарегистрирован: 29.02.2020
 
 
 
 
 
 
 
 
 
 
D:\АРДУР?РќРђ\программы базовые\ClassEndClass\ClassEndClass.ino: In function 'void setup()':
 
ClassEndClass:30: error: no matching function for call to 'Button4::Button4(int, int, int, int, int)'
 
D:\АРДУР?РќРђ\программы базовые\ClassEndClass\ClassEndClass.ino:30:32: note: candidates are:
 
D:\АРДУР?РќРђ\программы базовые\ClassEndClass\ClassEndClass.ino:11:7: note: constexpr Button4::Button4()
 
D:\АРДУР?РќРђ\программы базовые\ClassEndClass\ClassEndClass.ino:11:7: note:   candidate expects 0 arguments, 5 provided
 
D:\АРДУР?РќРђ\программы базовые\ClassEndClass\ClassEndClass.ino:11:7: note: constexpr Button4::Button4(const Button4&)
 
D:\АРДУР?РќРђ\программы базовые\ClassEndClass\ClassEndClass.ino:11:7: note:   candidate expects 1 argument, 5 provided
 
D:\АРДУР?РќРђ\программы базовые\ClassEndClass\ClassEndClass.ino:11:7: note: constexpr Button4::Button4(Button4&&)
 
D:\АРДУР?РќРђ\программы базовые\ClassEndClass\ClassEndClass.ino:11:7: note:   candidate expects 1 argument, 5 provided
 
D:\АРДУР?РќРђ\программы базовые\ClassEndClass\ClassEndClass.ino: In function 'void loop()':
 
ClassEndClass:48: error: 'pressEsc' was not declared in this scope
 
ClassEndClass:49: error: 'pressDec' was not declared in this scope
 
ClassEndClass:50: error: 'pressInc' was not declared in this scope
 
ClassEndClass:51: error: 'pressEnter' was not declared in this scope
 
D:\АРДУР?РќРђ\программы базовые\ClassEndClass\ClassEndClass.ino: In function 'void timerInterupt()':
 
ClassEndClass:56: error: 'but4' was not declared in this scope
 
D:\АРДУР?РќРђ\программы базовые\ClassEndClass\ClassEndClass.ino: At global scope:
 
ClassEndClass:60: error: prototype for 'Button4::Button4(byte, byte, byte, byte, byte)' does not match any in class 'Button4'
 
ClassEndClass:11: error: candidates are: constexpr Button4::Button4(Button4&&)
 
ClassEndClass:11: error: constexpr Button4::Button4(const Button4&)
 
ClassEndClass:11: error: constexpr Button4::Button4()
 
D:\АРДУР?РќРђ\программы базовые\ClassEndClass\ClassEndClass.ino: In member function 'void Button4::readButton4()':
 
ClassEndClass:69: error: 'button_Esc' was not declared in this scope
 
ClassEndClass:70: error: 'button_Dec' was not declared in this scope
 
ClassEndClass:71: error: 'button_Inc' was not declared in this scope
 
ClassEndClass:72: error: 'button_Enter' was not declared in this scope
 
exit status 1
no matching function for call to 'Button4::Button4(int, int, int, int, int)'
valeryich
Offline
Зарегистрирован: 29.02.2020
//   Пытаемся создать объект "панель оператора" из четырёх кнопок.
//   Объект класса  Button4 состоит из четырёх объектов класса ButtonSerge.
//   Цель - инициализировать и считывать все четыре кнопки одной строчкой в верхней программе

#include <ButtonSerge.h>
#include <MsTimer2.h> // библиотека прерываний по таймеру2

 byte chek1 = 0; 

class Button4 {  
  public:

   boolean pressEsc = false;  // true - если кнопка нажата
   boolean pressDec = false;
   boolean pressInc = false;
   boolean pressEnter = false; 

//void button4init(byte esc_pin,byte dec_pin,byte inc_pin,byte enter_pin,byte period);

  void readButton4();
}; 

 unsigned long time_current;
 unsigned long time_fix = 0;
 unsigned long time_Delta; 

void setup() {

     Button4 but4(12,11,10,9,20); // создаём объект из четырёх кнопок ESC,DEC,INC,ENTER, время отклика (20х5мс)
     
       MsTimer2::set(5, timerInterupt); // задаем период прерывания по таймеру 5 мс, вызываем функцию timerInterupt
       MsTimer2::start();              // разрешаем прерывание по таймеру, 
  
  Serial.begin(9600); 
}
 
void loop() {     
  
  time_current =  millis();
  time_Delta = time_current - time_fix;
  if ( time_Delta > 100)
  {
   time_fix = time_current;
   
   chek1 = chek1 + 1; 
   Serial.print(chek1); Serial.print("__"); 
   Serial.print(pressEsc);   Serial.print("__");
   Serial.print(pressDec);   Serial.print("__");
   Serial.print(pressInc);   Serial.print("__");
   Serial.println(pressEnter);
  }
}

void timerInterupt() {   //программа прерывания по таймеру, вызывается каждые 5 мс
     but4.readButton4();
}


Button4::Button4 (byte esc_pin,byte dec_pin,byte inc_pin,byte enter_pin,byte period) { // конструктор класса Button
  ButtonSerge button_Esc(esc_pin,period);  // создаём объекты "кнопки"
  ButtonSerge button_Dec(dec_pin,period);
  ButtonSerge button_Inc(inc_pin,period);
  ButtonSerge button_Enter(enter_pin,period);
}

void Button4::readButton4() { // опрос кнопок и формирование данных(каждые 5 мс)
  
        button_Esc.readButton1();  // опрос кнопок
        button_Dec.readButton1();
        button_Inc.readButton1();
        button_Enter.readButton1();
           pressEsc = button_Esc.press1;
           pressDec = button_Dec.press1;
           pressInc = button_Inc.press1; 
           pressEnter = button_Enter.press1;          
}

 

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

valeryich,

пожалуйста, прекратите над нами издеваться. Давайте 

1. Код (полный, копипастом)
2. Сообщения (полностью, копипастом)
3. Библиотеку (можно ссылку, или полный текст)
4. Объяснение что именно Вы пытаетесь делать.

Если не будет всего этого, Вам тут никто помочь не сможет.

valeryich
Offline
Зарегистрирован: 29.02.2020

смеяться и выступать я не намерен. Просто хочу решить проблему. Да, я новичок, прошу не судить строго.
Как выложить библиотеку, файлы вроде здесь не прикрепляются?

b707
Offline
Зарегистрирован: 26.05.2017

И кто за вас будет конструктор класса описывать в класе?

b707
Offline
Зарегистрирован: 26.05.2017

У библиотеки есть адрес на гитхабе? - давайте ссылку

valeryich
Offline
Зарегистрирован: 29.02.2020

файл Н

/*
 
 
ButtonSerge.h - библиотека для цифровой обработки сигналов контактов кнопок
 и сигналов других компонентов параллельным процессом
 
 
   В параллельном процессе должна регулярно (5мс) вызываться функция  void  readButton1(); - считывание сигнала с порта и ожидание стабильного состояния сигнала
 по среднему значению
.
В результате формируются признаки:
 
             
press1 == true , если кнопка нажата (digitalRead(pin)== 0)
             press1 == false
 , если кнопка не нажата (digitalRead(pin)== 1)
             buttonClick1 = true;  // если кнопку нажали сейчас (по фронту press1)
 
Объект типа Button при создании имеет параметры:
 - номер вывода, к которому подключена кнопка или сигнал
 - время обработки сигнала, умножается на период вызова метода void  readButton1();
 
 Button button1(12, 15);  // описание объекта в шапке программы
 button.setMode(byte pin, byte timeButton); // настройка объекта и режима ввода в теле программы
// создание объекта кнопки, подключенной к 12 выводу 
 с временем фильтрации 75 мс                              //(при цикле 5 мс)
 
 
 
Библиотека разработана Карабановым Сергеем
 
 
 
*/
 
#ifndef ButtonSerge_h         // если библиотека Button не подключена
 
#define ButtonSerge_h // тогда подключаем ее
 
 
 
#include "Arduino.h"
 
 
   
// класс обработки сигналов
 
 
class ButtonSerge {
   public:
       ButtonSerge (byte pin, byte timeButton);  // конструктор без настройки ввода
       boolean press1;          // признак "кнопка нажата" - true, если нажата,  false, если не нажата
       boolean buttonClick1;   // признак клика кнопки (фронт) - true, если кнопку нажали сейчас
       void  readButton1();          // считывание состояния порта и фильтрация дребезга по среднему значению
       void  setMode(byte pin, byte timeButton); //  инициализация с настройкой ввода
    
   private:
       char _count;        // счетчик времени фильтрации    
       byte _timeButton;  // время фильтрации    
       byte _pin;        // номер вывода
};
 
#endif
 
файл СРР..............................
 
#include "Arduino.h"
#include "ButtonSerge.h"
 
void  ButtonSerge::readButton1() {
  
     if ( digitalRead(_pin) == 0 ) { _count = _count+1;}        //если кнопка нажата
                                    else { _count = _count-1;} //если кнопка не нажата
     if ( _count >= _timeButton) {if (press1 == false) buttonClick1 = true;  //кнопка нажата? кнопку нажали?
                                  _count = _timeButton;   // ограничиваем значение счётчика при переполнении
                                  press1 = true;        // кнопка нажата
                                 }
     if ( _count <= 0) { _count = 0;// ограничиваем значение счётчика при переполнении
                        press1 = false;  // кнопка не нажата
                      } 
}
void  ButtonSerge::setMode(byte pin, byte timeButton) {
       _pin= pin;
       _timeButton= timeButton;
       pinMode(_pin, INPUT_PULLUP);  // определяем вывод как вход
}
 
ButtonSerge::ButtonSerge(byte pin, byte timeButton) {
       _pin= pin;
       _timeButton= timeButton;
}
 
 
 
 
 
 
 
 
 
 
 
b707
Offline
Зарегистрирован: 26.05.2017

блиин... ну он правда издевается.

 

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

Ага, понятно.

Вот смотрите, Вы обявляете переменные - свойства класса в строка 13-16. Почему-то Вы их объявляете именно в самом классе, а не в конструкторе! А вот кнопки (такие же переменные) решили объявить в конструкторе. Что за двойные стандарты?

Теперь смотрети, что у Вас получилось.

1.

В строке №59 Вы определяете конструктор 

Button4::Button4 (byte esc_pin,byte dec_pin,byte inc_pin,byte enter_pin,byte period)

но ведь в Вашем классе не описан такой конструктор! Описание класса - строки с №10 по №21 - где там описание такого конструктора?

Далее

2.

Внутри функции Button4::Button4 Вы в строке №60 описываете локальную переменную button_Esc. Область видимости этой переменной - её родная функция. Вне функции Button4::Button4 эта переменная не существует! Какого ж хрена Вы пытаетесь её использовать в функции Button4::readButton4() в строке №68? Откуда ей там взяться?

Ну, пока хватит, исправьте это, потом будем смотреть дальше.

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

valeryich
Offline
Зарегистрирован: 29.02.2020

b707 пишет:

И кто за вас будет конструктор класса описывать в класе?

Конструктор ButtonSerge описан в библиотеке ButtonSerge.h   :

ButtonSerge::ButtonSerge(byte pin, byte timeButton) {
       _pin= pin;
       _timeButton= timeButton;
}

Библиотека прикреплена в начале скетча. Что не так?

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

valeryich,

опять с кодом беда?

Еще такой закидон и помогайте себе сами!

Почитайте мой прошлый пост! Там же сплошные номера строк! Как мне писать Вам что-то на Ваши портянки? "В строке №ХЗ написан бред". Так что-ли?

valeryich
Offline
Зарегистрирован: 29.02.2020

Библиотеку вчера написал. Пока ещё никуда её не выкладывал, ссылок на нее нет.

valeryich
Offline
Зарегистрирован: 29.02.2020
#ifndef ButtonSerge_h         // если библиотека Button не подключена

#define ButtonSerge_h	// тогда подключаем ее



#include "Arduino.h"


   
// класс обработки сигналов


class ButtonSerge {
   public:
       ButtonSerge (byte pin, byte timeButton);  // конструктор без настройки ввода
       boolean press1;          // признак "кнопка нажата" - true, если нажата,  false, если не нажата
       boolean buttonClick1;   // признак клика кнопки (фронт) - true, если кнопку нажали сейчас
       void  readButton1();          // считывание состояния порта и фильтрация дребезга по среднему значению
       void  setMode(byte pin, byte timeButton); //  инициализация с настройкой ввода
    
   private:
       char _count;        // счетчик времени фильтрации    
       byte _timeButton;  // время фильтрации    
       byte _pin;        // номер вывода
};

#endif

#include "Arduino.h"
#include "ButtonSerge.h"

void  ButtonSerge::readButton1() {
  
     if ( digitalRead(_pin) == 0 ) { _count = _count+1;}        //если кнопка нажата
                                    else { _count = _count-1;} //если кнопка не нажата
     if ( _count >= _timeButton) {if (press1 == false) buttonClick1 = true;  //кнопка нажата? кнопку нажали?
                                  _count = _timeButton;   // ограничиваем значение счётчика при переполнении
                                  press1 = true;        // кнопка нажата
                                 }
     if ( _count <= 0) { _count = 0;// ограничиваем значение счётчика при переполнении
                        press1 = false;  // кнопка не нажата
                      } 
}
void  ButtonSerge::setMode(byte pin, byte timeButton) {
       _pin= pin;
       _timeButton= timeButton;
       pinMode(_pin, INPUT_PULLUP);  // определяем вывод как вход
}

ButtonSerge::ButtonSerge(byte pin, byte timeButton) {
       _pin= pin;
       _timeButton= timeButton;
}



 

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

valeryich пишет:

Библиотека прикреплена в начале скетча. Что не так?

Не так то, что Вы понятия не имеете как описываются классы. Потренируйтесь на маленьком классе сначала. Научитесь писать конструкторы, переменные класса и т.п.

valeryich
Offline
Зарегистрирован: 29.02.2020

Попросили текст, я и выложил текст, а не код. Поверьте, я не издеваюсь.

b707
Offline
Зарегистрирован: 26.05.2017

valeryich пишет:

Конструктор ButtonSerge описан в библиотеке ButtonSerge.h   :

а конструктуор Button4 где описан?

Впрочем. вам Евгений уже подробнее описал - читайте его.

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

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

valeryich пишет:

Библиотеку вчера написал. Пока ещё никуда её не выкладывал, ссылок на нее нет.

Меня терзают смутные сомнения. Автор библиотеки знает, что конструкторы надо описывать в классе, автор основного скетча - нет. Не думаю, что эти коды писал один и тот же человек :-)

Вы мой #16 пост читали? Разбирайтесь. Спокойно разбирайтесь, Вы слишком много и часто постите - Вам подумать некогда.

b707
Offline
Зарегистрирован: 26.05.2017

хотите сказать, что класс ButtonSerge написали вы? - не верю... небось скопировали откуда-то, изменив название?

Иначе непонятно,  что помешало вам так же написать класс Button4:)

valeryich
Offline
Зарегистрирован: 29.02.2020

ЕвгенийП пишет:

 

Ну, пока хватит, исправьте это, потом будем смотреть дальше.

 

спасибо огромное, начинаю исправлять. Будет долго.

valeryich
Offline
Зарегистрирован: 29.02.2020

b707 пишет:

хотите сказать, что класс ButtonSerge написали вы? - не верю... небось скопировали откуда-то, изменив название?

Иначе непонятно,  что помешало вам так же написать класс Button4:)

Да, я.
Button4 использует объекты другого класса. А на эту тему (взаимодействие классов между собой) - уроков нет.

Напишу Button4 - выложу здесь работающий вариант.

b707
Offline
Зарегистрирован: 26.05.2017

valeryich пишет:

Button4 использует объекты другого класса. А на эту тему (взаимодействие классов между собой) - уроков нет.

у вас проблема не с "взаимодействием классов между собой", а в совершенно базовых принципах языка Си, например "область действия переменных" - заметьте, не "классов", а обычных банальных переменных.

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

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

Цитата:
Напишу Button4 - выложу здесь работающий вариант.

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

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

valeryich пишет:

Напишу Button4 - выложу здесь работающий вариант.

Лучше ознакомьтесь вот с этой темой и переопределите Reset как GPIO, чтобы никто прочитать не смог :-)

GarryC
Offline
Зарегистрирован: 08.08.2016

Вы, конечно, извините, но Ваш класс содержит в себе 4 переменных булевого типа, но никак не 4 объекта типа Кпопка, о чем Вам компилятор и пытается сказать.

valeryich
Offline
Зарегистрирован: 29.02.2020

GarryC пишет:

Вы, конечно, извините, но Ваш класс содержит в себе 4 переменных булевого типа, но никак не 4 объекта типа Кпопка, о чем Вам компилятор и пытается сказать.


Так про это и мой вопрос был. Я объекты не в том месте и не так объявлял.
Об этом я и "пытался спросить".