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

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

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

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

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

 

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

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

Blinker:

01class Blinker
02{
03public:
04  Blinker(int p_delay=2);
05  void blink();
06private:
07  int m_delay_ms;
08};
09 
10Blinker::Blinker(int p_delay /*=2*/)
11  : m_delay_ms(p_delay)
12{
13}
14 
15void Blinker::blink()
16{
17  digitalWrite(13, HIGH);
18  delay(m_delay_ms);
19  digitalWrite(13, LOW);
20  delay(m_delay_ms);
21}
22 
23Blinker blink(1000);
24 
25void setup() {
26  // put your setup code here, to run once:
27  pinMode(13,OUTPUT);
28}
29 
30void loop() {
31  // put your main code here, to run repeatedly:
32  blink.blink();
33}

 

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

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

 

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

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

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

 

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

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

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

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

1: m_delay_ms(p_delay)

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

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

01class Blinker    // создаем класс Blinker
02{                 // описание класса
03public:            // публичная
04  Blinker(int p_delay=2); // переменная...
05  void blink();           // и функция
06private:           // приватная
07  int m_delay_ms;    //переменная
08};
09 
10Blinker::Blinker(int p_delay /*=2*/) // это наверно конструктор класса Blinker ?
11  : m_delay_ms(p_delay)              // ????? а вот что это такое??? я не понял
12{
13}
14 
15void Blinker::blink()            // функция объекта Blinker называется blink
16{
17  digitalWrite(13, HIGH);     // вкл.
18  delay(m_delay_ms);          // пауза
19  digitalWrite(13, LOW);     // выкл.
20  delay(m_delay_ms);         // пауза
21}
22 
23Blinker blink(1000);         // объект (или экземпляр) класса blink с переданным в него значением 1000
24 
25void setup() {
26  // put your setup code here, to run once:
27  pinMode(13,OUTPUT);        
28}
29 
30void loop() {
31  // put your main code here, to run repeatedly:
32  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 строке?
 

1Blinker(int p_delay=2);

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

1: m_delay_ms(p_delay)

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

1m_delay_ms = p_delay;

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

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

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

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

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

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

01#include "stdafx.h"
02#include <iostream>
03using namespace std;
04 
05class A {
06public:
07    int i;
08    A(int ii) : i(ii) {
09        cout << i << endl;
10    }
11 
12};
13 
14int main(int argc, char* argv[])
15{
16    A a(5);
17    system("pause");
18    return 0;
19}

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

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

 

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

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 пишет:

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

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

И этот

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

 

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

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

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

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

DetSimen пишет:

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

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

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