Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


Ответ
Опции темы
Непрочитано 06.11.2022, 12:42   #1
Variant99
Частый гость
 
Регистрация: 16.06.2016
Сообщений: 14
Сказал спасибо: 3
Сказали Спасибо 32 раз(а) в 13 сообщении(ях)
Variant99 на пути к лучшему
По умолчанию Применение С++

И решил я изучать С++. И прочел я статейки про классы, объекты, инкапсуляцию с наследованием, методы, конструкторы-деструкторы и прочее. И все вроде понятно. Непонятно только как это теперь к микроконтроллерам применить.
Получается что сильно отличается от С. Всё завязано на объектах и без них никак. В С както проще, вызвал функцию и всё, а в С++ объекты надо...
Реклама:
__________________
Модератор еблан хуев
Variant99 вне форума   Ответить с цитированием
Непрочитано 06.11.2022, 13:10   #2
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,257
Сказал спасибо: 11,169
Сказали Спасибо 3,858 раз(а) в 2,928 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: Применение С++

А более системно подойти и попользоваться книгами?
Бьёрн Страуструп
Язык программирования С++
Справочное руководство по языку программирования С++ с комментариями
Программирование: принципы и практика использования C++

Можно купить и классически с карандашом и закладками, можно в электронном формате…
Потребность появится при росте объема систем, когда станет проще работать с объектами и классами, а не с переменными и функциями…
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
mike-y-k вне форума   Ответить с цитированием
Непрочитано 06.11.2022, 13:14   #3
Signalshik2
Вид на жительство
 
Аватар для Signalshik2
 
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
Signalshik2 на пути к лучшему
По умолчанию Re: Применение С++

В микроконтроллерах объекты не нужны. C достаточно для них.
Signalshik2 вне форума   Ответить с цитированием
Непрочитано 06.11.2022, 13:19   #4
akegor
Гуру портала
 
Аватар для akegor
 
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,033
Сказал спасибо: 2,559
Сказали Спасибо 11,881 раз(а) в 5,958 сообщении(ях)
akegor на пути к лучшему
По умолчанию Re: Применение С++

Сообщение от Signalshik2 Посмотреть сообщение
В микроконтроллерах объекты не нужны.
В Тиньках - да. Опрометчивость заявления растет с ростом сложности задачи, решаемой погромистом.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
akegor вне форума   Ответить с цитированием
Непрочитано 06.11.2022, 13:25   #5
Signalshik2
Вид на жительство
 
Аватар для Signalshik2
 
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
Signalshik2 на пути к лучшему
По умолчанию Re: Применение С++

Да и в Мегах тоже.
Signalshik2 вне форума   Ответить с цитированием
Непрочитано 06.11.2022, 13:32   #6
NewWriter
Заблокирован
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: Применение С++

Прочли - это хорошо Осталось теперь понять, что объектно-ориентированное программирование в С++, в отличие от процедурного (фукнционального) в обычном Си, оперирует понятием "объект программирования", у которого есть свойства и методы взаимодействия с ним.
Если раньше в процедурном Си вы просто писали функции и создавали переменные, которые описывали просто какие-то действия, без привязки ни к чему конкретному, то в объектно-ориентированном С++ как правило не существует просто отдельных оторванных фукнций. Вместо этого они привязаны к конкретным объектам и отражают то, что объект может сам делать, или наоборот, что с объектом можно сделать извне.

Вернее, применительно к микроконтроллерам, часть функций может быть всё-же оторвана от объектов.
Вызвать метод без создания объекта можно, написав в классе публичный static-метод, и тогда его вызов будет выглядеть как MyClass::MyMetod();

Если вы не поняли, зачем нужны все эти объекты в микроконтроллере, то загляните не с точки зрения работы с периферией МК, а с точки зрения того, какую работу выполняет микроконтроллер в качестве управляющего элемента какого-то устройства. То есть, смотрите шире и выше. Не глубже внутрь МК, а именно выше, поверх МК.
Вот например у вас есть объект - электрочайник. У него есть свойства - объем воды в нем и мощность нагревателя. И есть метод - греть воду. Вооот. То есть, теперь пишите класс "чайник", внутри него privat-свойства "объем" и "мощность нагревателя". И public-метод "греть воду".
Код:
class Teapot {
private:
	int volume;		// свойство "объем"
	int power;		// свойство "мощность"
public:
	/* конструктор при создании объекта
	 * присваивает переменным значения */
	Teapot(int volume, int power)
	{
		this-›power = power;
		this-›volume = volume;
	}

	/* метод "греть воду" */
	void HeatWater(int action)
	{
		if(action == 1)
			HEAT_ON();
		else
			HEAT_OFF();
	}
};

int main(void)
{
/* создали объект "мой чайник" класса "чайник", 3 литра, 2,1 кВт */
	Teapot MyTeapot(3000, 2100);  

/* сказали "моему чайнику" - "нагреть воду" */
	MyTeapot.HeatWater(1); 
}
В этом примере, правда, свойства volume и power не используются.
Ну вот, вы уже получили объектно-ориентированный метод программирования, когда у вас есть конкретный объект, а не просто функции.

Сообщение от Signalshik2 Посмотреть сообщение
В микроконтроллерах объекты не нужны. C достаточно для них.
В мелких мелкоконтролерах в принципе то и не нужны. Хотя, Ардуина на тех самых мелких использует как раз С/С++ язык! Правда, я не очень то смотрел, как у них там реализовано, но судя по синтаксису, используют как раз объекты. Хотя, мыслят они по-прежнему, на уровне процедурного программирования.

Последний раз редактировалось NewWriter; 06.11.2022 в 13:47.
NewWriter вне форума   Ответить с цитированием
Сказали "Спасибо" NewWriter
mike-y-k (06.11.2022)
Непрочитано 06.11.2022, 15:42   #7
Variant99
Частый гость
 
Регистрация: 16.06.2016
Сообщений: 14
Сказал спасибо: 3
Сказали Спасибо 32 раз(а) в 13 сообщении(ях)
Variant99 на пути к лучшему
По умолчанию Re: Применение С++

Ну хорошо буду смотреть выше. Создали объект "мой чайник" и включили нагрев воды. Как то многовато действий. А нельзя просто включить чайник без того чтобы создавать этот чайник?
И еще зачем нужны гетеры и сетеры и почему именно через них надо делать? Разве нельзя попростому?
Variant99 вне форума   Ответить с цитированием
Непрочитано 06.11.2022, 15:58   #8
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,257
Сказал спасибо: 11,169
Сказали Спасибо 3,858 раз(а) в 2,928 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: Применение С++

Variant99, Вам на пальцах при минимуме показали принципы ООП…
Если про зачем - таки если чайник перерастет в объект с сотней переменных, количество разработчиков станет больше 1, потребуется использовать и вести общие библиотеки методов, появиться необходимость высокоуровневых абстракций,…
Тут вот работа с объектами и найдет свое место…
А если не абстрагироваться от чайника, то там на ассемблере написать все можно…
У меня есть хороший знакомый, который такие мелочи пишет просто в шестнадцатеричном редакторе - профдеформация человека, занятого большую часть времени анализом дампов прошивок и восстановлением из них алгоритмов…
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
mike-y-k вне форума   Ответить с цитированием
Непрочитано 06.11.2022, 16:12   #9
dgrishin
Почётный гражданин KAZUS.RU
 
Регистрация: 12.02.2013
Сообщений: 1,037
Сказал спасибо: 43
Сказали Спасибо 273 раз(а) в 214 сообщении(ях)
dgrishin на пути к лучшему
По умолчанию Re: Применение С++

Сообщение от Variant99 Посмотреть сообщение
А нельзя просто включить чайник без того чтобы создавать этот чайник?
Конечно можно. Но в ООП объект это сущьность, с которой можно выполнять действия и которая обладает определеннымси свойствами и все это "в одном флаконе"
Например ваш чайник также може иметь свойства - количество воды в нем и температура воды. Вы в функции включения нагрева можете проверяит эти свойства чайника вызовом дополнительных методов. Если воды мало или температура близка с 100градусам то включать его не нужно - именно эти действия обычно делают люди.
Это уже не процедурно-ориентированное программирование а "чайникоописание" - новый уровень абстракции.
dgrishin вне форума   Ответить с цитированием
Сказали "Спасибо" dgrishin
mike-y-k (06.11.2022)
Непрочитано 06.11.2022, 16:19   #10
NewWriter
Заблокирован
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: Применение С++

[пока я писал, dgrishin опередил и уже написал как раз про температуру]

Конечно можно и не создавать объект, а просто в классе Teapot написать публичный статический метод вот так:
static void HeatWater(int action) { ... }
и тогда можно его вызывать без создания объекта:
Teapot::HeatWater(1);
static-методы и static-поля (переменные) являются общими для всех созданных экземпляров класса (т.е. объектов).

Коль уж вы решили писать на С++, то куда деваться, придется мыслить объектно. Хотя, С++ ардуинщикам не мешает мыслить по-прежнему процедурно, а классы и объекты использовать просто как синтаксис группировки по принадлежности.

Геттеры и сеттеры - это такие условные названия методов, которые присваивают приватным полям класса значения или читают из них вовне. Сделаны они для соблюдения принципа инкапсуляции. Чисто условный программный механизм безопасного взаимодействия с приватными полями класса, когда нужно защитить их от неверных действий.
На примере того же чайника. Допустим, у чайника в классе есть приватное поле температуры воды:
Код:
class Teapot {
private:
	int temperature;	// температура воды
public:
	/* получение значения температуры воды */
	int getTemperature()
	{
		return temperature;
	}
метод getTemperature() является геттером и получает значение поля temperature. Вне этого класса никак невозможно изменить поле temperature, для внешних запросов это поле закрыто на запись, возможно только его чтение:
int t = MyTeapot.getTemperature();
Правда, в практической реализации надо прописать, каким образом поле temperature вообще получает реальное значение. Например, в том же геттере прописать чтение измерителя текущей температуры.

Пример сеттера:
Код:
	void setVolume(int volume)
	{
		if(volume › 4000) volume = 4000;
		if(volume ‹ 1000) volume = 1000;
		this-›volume = volume;
	}
он ограничивает максимальный и минимальный устанавливаемый объем воды, и не позволит задать например 50000 (50 литров).

То есть, реализуется программный механизм защиты от несанкционированного изменения переменной температуры или неверных значений объема, делая невозможным случайную или намереную "поломку" функционирования программы программистом.

На обчном Си подобное так же можно реализовать, написав отдельный файл исходника teapot.c, в нем записать переменную static int temperarure; и написать фукнцию
int Teapot_GetTemperature(void) { return temperature }
и перенести ее прототип в файл интерфейса модуля teapot.h
Получится то же самое. Разве что в Си хуже обстоит дело с областями видимости и наследованием, механизм сокрытия работает лишь частично.
В принципе, в С++ заложено то же самое, что и в Си, только это сделано более строго и сразу даны продвинутые инструменты для реализации безопасных "капсульных" методов.

Последний раз редактировалось NewWriter; 06.11.2022 в 16:36.
NewWriter вне форума   Ответить с цитированием
Сказали "Спасибо" NewWriter
mike-y-k (06.11.2022)
Ответ

Закладки


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Старейший инструмент человека - новое применение 4712357482 Отвлекитесь, эмбеддеры! 51 25.12.2017 13:12
Применение конденсаторов Low ESR в низкочастотных схемах Demo65 Источники питания и свет 12 25.03.2017 21:23
Применение PSoC3 CY8CKIT-030. Лабораторный блок питания ViorDash ПЛИС и другие МК 7 14.11.2014 01:24
Нашел применение батарейкам от сигарет Kabron Делимся опытом 4 02.06.2013 21:14
Применение схемы регулятора jipers Электроника - это просто 4 09.11.2010 21:28


Часовой пояс GMT +4, время: 15:48.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot