Классы и объекты в Arduino

siberianice
Offline
Зарегистрирован: 02.04.2014

Добрый день всем!

Возник такой вопрос.
Правильно ли я понимаю, что при программировании Arduino нельзя создать свои классы и объекты в самой программе? Только с помощью библиотеки? 

И Arduino не поддерживает сам в чистом виде ООП?

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Создать новый скетч, сохранить его, например с именем Blinker, скопировать скетч ниже, скомпилировать, прошить. Работает?

Blinker:

class Blinker
{
public:
  Blinker(int p_delay=2);
  void blink();
private:
  int m_delay_ms;
};

Blinker::Blinker(int p_delay /*=2*/)
  : m_delay_ms(p_delay)
{
}

void Blinker::blink()
{
  digitalWrite(13, HIGH);
  delay(m_delay_ms);
  digitalWrite(13, LOW);
  delay(m_delay_ms);
}

Blinker blink(1000);

void setup() {
  // put your setup code here, to run once:
  pinMode(13,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  blink.blink(); 
}

 

siberianice
Offline
Зарегистрирован: 02.04.2014

Громадное спасибо! )

 

siberianice
Offline
Зарегистрирован: 02.04.2014

Еще столкнулся с частичным искажением данных, если в классе один из параметров
- массив byte без указания размера.

Может так делать не рекомендуется? А если размер массива указываю сразу, искажений нет.
Или глюк?

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Если массив, член класса, без указания размера, то размер его, я даже не знаю, скорей всего пустой, глюки обеспечены. Либо указывать размер при объявлении, либо создавать динамически (не рекомендую). Хотя если динамически и создавать один раз тогда вполне нормально.

junior_developer
Offline
Зарегистрирован: 27.11.2017

Помогите пожалуйста понять, что означает 11 строка скетча?

: m_delay_ms(p_delay)

Почему она начинается с двух точек ":"? Что значит этот символ в данном случае? Даже не знаю, по какому запросу искать?

Я проанализировал и прокомментировал скетч! Кто разбирается, пожалуйста посмотрите, правильно ли я написал?

class Blinker    // создаем класс Blinker
{                 // описание класса
public:            // публичная
  Blinker(int p_delay=2); // переменная...
  void blink();           // и функция
private:           // приватная
  int m_delay_ms;    //переменная
};

Blinker::Blinker(int p_delay /*=2*/) // это наверно конструктор класса Blinker ?
  : m_delay_ms(p_delay)              // ????? а вот что это такое??? я не понял
{
}

void Blinker::blink()            // функция объекта Blinker называется blink
{
  digitalWrite(13, HIGH);     // вкл.
  delay(m_delay_ms);          // пауза
  digitalWrite(13, LOW);     // выкл.
  delay(m_delay_ms);         // пауза
}

Blinker blink(1000);         // объект (или экземпляр) класса blink с переданным в него значением 1000

void setup() {
  // put your setup code here, to run once:
  pinMode(13,OUTPUT);         
}

void loop() {
  // put your main code here, to run repeatedly:
  blink.blink();           // объект blink с функцией blink 

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017
10 Blinker::Blinker(int p_delay /*=2*/// это наверно конструктор класса Blinker ?
11   : m_delay_ms(p_delay)              // ????? а вот что это такое??? я не понял
12 {
13 }

 

это инициализатор полей класса. В этом месте можно присвоить начальные значения переменным класса. Можно вызвать конструктор этого же класса с другими параметрами. 

 

 

junior_developer
Offline
Зарегистрирован: 27.11.2017

Спасибо Вам за подсказку! А не могли бы Вы детельнее описать, что делают эти строчки?
Я так понял, что в 10 строке инициализируется переменная p_delay типа int и ей присваивается значение 2, указанное в 4 строке?
 

Blinker(int p_delay=2);

Верно? А что происходит дальше? Я так и не понял, что происходит в строке 11
 

: m_delay_ms(p_delay)

Переменная m_delay_ms принимает значение переменной p_delay?
Это эквивалентно записи:
 

m_delay_ms = p_delay;

Верно ли я рассуждаю? Может я задаю глупые вопросы,  но я ещё никогда не видел строчек на С++, начинающихся с двоеточия! Для чего там оно, так и не понял! Объясните пожалуйста, кому не сложно!
Заранее спасибо!

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

https://msdn.microsoft.com/ru-ru/library/s16xw1a8.aspx

Иль ты думаешь, тебе тут лекции по С++ чтить будут? Дали пинок в нужную сторону и читай, разбирайса.

Lion777
Offline
Зарегистрирован: 20.05.2016

Это обычная инициализация полей(свойств класса)

#include "stdafx.h"
#include <iostream>
using namespace std;

class A {
public:
	int i;
	A(int ii) : i(ii) {
		cout << i << endl;
	}

};

int main(int argc, char* argv[])
{
	A a(5);
	system("pause");
	return 0;
}

есть несколько вариантов инициализации.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

 

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

https://ru.stackoverflow.com/questions/475616/%D0%9E%D0%BF%D0%B5%D1%80%D...

ПС: по теме. Это говорит что функция находится в данном классе.

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

Пух, ты бухой?  Ты вопрос читал? 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

DetSimen пишет:

Пух, ты бухой?  Ты вопрос читал? 

Ну и что. Все равно вы вокруг и около. А почему так не сказали. В общем сравните два скетча.

/**/
//----------------------------
class Cl_AAA {
  protected:
    const byte data; //<-- потому что здесь стоит const
  public:
    /*конструктор*/
    Cl_AAA(byte d) {
      data = d; //<-- вот хрен такое пройдет
    }
};
//----------------------------
void setup() {
}

void loop() {

}

И этот

/**/
//----------------------------
class Cl_AAA {
  protected:
    const byte data; //<-- потому что здесь стоит const
  public:
    /*конструктор*/
    Cl_AAA(byte d):data(d)  { //<--  а вот так залетает 
    }
};
//----------------------------
void setup() {
}

void loop() {

}

А это так на закуску.

/**/
//----------------------------
class Cl_AAA {
  protected:
    const byte data;
  public:
    /*конструктор*/
    Cl_AAA(byte d): data(d)  {
    }
};
//-----------------------
class Cl_BBB {
  protected:
    const Cl_AAA AAA; //<-- заметьте объект в классе константный
  public:
    /*конструктор*/
    Cl_BBB(byte d): AAA(d)  { // и его и здесь можно инициализировать
    }
};
//-------------------------
Cl_BBB BBB(/*data*/10);
//----------------------------
void setup() {
}

void loop() {

}
/*Скетч использует 488 байт (1%) памяти устройства. Всего доступно 30720 байт.
  Глобальные переменные используют 10 байт (0%) динамической памяти, оставляя 2038 байт для локальных переменных. Максимум: 2048 байт.
*/

 

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

я дал пинок в нужную сторону и дал ссылку на почитать побольше.  Имеющий глаза и моск - разбереца.  Там и про const написана. 

только при чём здесь область видимости aka :: ? 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

DetSimen пишет:

я дал пинок в нужную сторону и дал ссылку на почитать побольше.  Имеющий глаза и моск - разбереца.  Там и про const написана. 

только при чём здесь область видимости aka :: ? 

Ну в начале темы там был скетч. Вот только я не понял зачем описание метода наружу класса вытащили. Я обычно внутри держу. Все равно в одном файле.