13626
Изучаем C++. По вопросам сотрудничества: @adv_and_pr
Безопасно рисуем иконки в ПЗУ и ловим UB в C++ коде на IAR компиляторе
Смотреть статью
Пример простой нейросети на С/C++
Смотреть статью
Call Stack Logger — инструментирование функций как способ отслеживания потока выполнения программы
Доводилось ли вам когда-нибудь работать над C++ проектом с такой огромной кодовой базой, что понимание того, что на самом деле происходит во время выполнения программы, требует кучи времени и сил?
Смотреть статью
📕Открытый урок об оцифровке сигналов в микроконтроллере ESP32 для радиолюбителей, разработчиков встраемого ПО, инженеров, разработчиков электроники и инженеров-схемотехников.
На открытом уроке 10 апреля в 20:00 мск мы погрузимся в процессы и тонкости оцифровки сигнало на пример микроконтроллера ESP32.
📗 В результате вы:
- Узнаете всё об особенностях и нюансах схемотехники при проектировании тракта АЦП;
- Поймете, как работать с АЦП на примере ESP32: от расчета погрешностей и калибровки до различных методов фильтрации сигналов;
- Научитесь на практике использовать все основные параметры АЦП и увидите их влияние вживую.
Спикер Марат Боранбаев — эксперт в сфере Fullstack Embedding, 10+ лет в разработке и преподавании, занимается разработкой для системы бортового радиотехнического комплекса космического аппарата на базе МК STM32.
👉 Регистрируйтесь прямо сейчас, чтобы не пропустить мероприятие: https://otus.pw/Swbl/
📙 Все участники открытого урока получат скидку на курс "Embedded Developer"
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
#вопросы_с_собеседований
Зачем нужен виртуальный деструктор?
Для того, чтобы избежать утечки ресурсов и другого неконтролируемого поведения объекта.
Без ключевого слова virtual у родительского класса Base деструктор порожденного класса не был бы вызван. Т.е. вызвался бы только ~Base():
Hello from ~Base()Читать полностью…
#вопросы_с_собеседований
Что такое флажки компиляции?
Флажки компиляции — это специальные опции, которые можно указать при компиляции кода, чтобы включить или отключить определенные возможности языка или библиотек.
Используя разные комбинации флажков, можно тонко настроить процесс компиляции под нужды конкретного проекта.
Например:
— std=c++11: включает поддержку стандарта C++11.
— O2: включает оптимизацию кода на уровне O2.
— g: добавляет отладочную информацию в скомпилированный файл.
— Wall: включает предупреждения обо всех возможных ошибках.
— DDEBUG: определяет макрос DEBUG, чтобы можно было использовать условную компиляцию.
— I<path>: добавляет директорию по указанному пути в поиск заголовочных файлов.
Дружественные функции
Дружественные функции (friend functions) — это функции, которые объявлены как дружественные внутри класса и имеют доступ к закрытым и защищенным членам этого класса. Это позволяет функциям, которые не являются методами класса, работать с его данными. Дружественные функции объявляются с использованием ключевого слова friend внутри определения класса.
Использование дружественных функций следует ограничивать в тех случаях, когда это действительно необходимо, так как это может нарушать инкапсуляцию данных и сделать код менее структурированным и управляемым.
#для_начинающих
Принцип lock-free
Принцип lock-free (без блокировок) в С++ относится к методам многопоточного программирования, которые позволяют избегать использования блокировок (locks) для обеспечения безопасности доступа к данным из нескольких потоков.
Основная идея lock-free программирования заключается в том, чтобы позволить нескольким потокам одновременно работать с общими данными без блокировки выполнения одного или нескольких потоков.
Однако стоит отметить, что написание lock-free кода может быть сложным и требовать более глубокого понимания атомарных операций и алгоритмов.
#для_продвинутых
std::lock_guardstd::lock_guard — это один из классов в стандартной библиотеке C++, предназначенных для обеспечения многопоточной безопасности при работе с разделяемыми данными. Он используется для автоматического захвата и освобождения мьютекса (mutex) при входе и выходе из блока кода.
Прежде всего, мьютекс (mutex) — это механизм синхронизации, который предоставляет эксклюзивный доступ к разделяемым данным одному потоку в данный момент времени. std::lock_guard является удобной оберткой для работы с мьютексами.
#для_продвинутых
📕Открытый урок о работе со звуком в микроконтроллерах для разработчиков, инженеров, любителей электроники, радиолюбителей и инженеров-схемотехников.
На открытом уроке 2 апреля в 20:00 мск мы погрузимся в работу со звуковой магией микроконтроллеров.
📗 В результате вы:
- Узнаете всё об основных правилах оцифровки сигналов, ЦАП и усилителе класса D;
- Поймете, как работают микроконтроллеры на примере ESP32: от интерфейса I2S до временных диаграмм и их применения;
- Научитесь на практике обработке звука, цифровой фильтрации, записи AAC или MP3 из памяти микроконтроллера и созданию простого mp3-плеера из ESP32 и sd-карточки.
Спикер Игорь Морозов — эксперт в сфере Embedded Development, 15+ лет в разработке и управлении IT-проектами, технический директор стартапа по созданию робототехнических устройств с элементами машинного зрения.
👉 Регистрируйтесь прямо сейчас, чтобы не пропустить мероприятие: https://otus.pw/ryo1/
📙 Все участники открытого урока получат скидку на курс "Embedded Developer"
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
🗞 EasyOffer 2.0 собрал более 1 млн рублей за первые сутки краудфандинга
Платформа EasyOffer, предназначенная для подготовки к IT-собеседованиям, объявила о разработке новой версии сервиса. За первые 24 часа краудфандинга проекту удалось привлечь более 1 000 000 рублей.
В релизе EasyOffer 2.0 планируется:
— крупнейшая база реальных вопросов и задач с технических интервью
— тренажёры по интервальным повторениям и симуляторы собеседований
— аналитика по компаниям, грейдам, популярности и сложности вопросов
— тестовые задания и требования из вакансий
📆 Релиз запланирован на конец мая.
Сейчас в рамках сбора средств можно оформить годовой PRO-доступ за 3 200 ₽. После запуска такая сумма будет соответствовать цене месячной подписки.
std::bytestd::byte — это тип данных, введенный в стандарт C++17. Он представляет собой один байт, то есть 8 бит. std::byte не является ни типом символа, ни типом числа. Он предназначен для представления байтов в памяти, независимо от того, используются они для хранения символов, чисел или чего-либо еще.std::byte может использоваться в следующих случаях:
— Для доступа к памяти, занимаемой другими объектами.
— Для работы с низкоуровневыми функциями, такими как чтение и запись в порты ввода-вывода.
— Для реализации собственных типов данных, которые должны хранить байты.
#для_продвинутых
absl::btreeabsl::btree представляет собой реализацию дерева поиска (B-tree) в библиотеке Abseil, которая предоставляет набор базовых структур данных и других полезных компонентов для C++. Abseil (или Abseil C++ Common Libraries) — это набор библиотек, разработанных Google, предназначенных для общего использования в C++ проектах.
Дерево поиска (B-tree) является структурой данных, которая используется для хранения отсортированных данных и обеспечивает эффективные операции вставки, удаления и поиска. Одним из применений B-деревьев является хранение данных в базах данных.absl::btree предоставляет реализацию эффективного B-дерева, которое может быть использовано в ваших C++ проектах.
#для_продвинутых
Умные указатели в С++
Умные указатели - это шаблоны классов, которые позволяют автоматически управлять памятью и не допускать утечек.
Среди основных умных указателей:
- unique_ptr - указатель, который владеет объектом в единственном экземпляре.
- shared_ptr - указатель, у которого может быть несколько владельцев.
- weak_ptr - указатель на объект, владельцем которого является shared_ptr.
#это_база
Хакатон от МТС: 5 треков и 1 500 000 рублей. Для тех, кто готов воплотить идею в прототип
Приглашаем на хакатон МТС True Tech Hack 2025. Протестируй свои идеи и разработай решение на базе одной из пяти ИТ-платформ МТС.
Призовой фонд соревнования — 1 500 000 рублей.
Участие могут принять системные аналитики, Data Scientists, Data Engineers, frontend и backend-разработчики, Android-разработчики, бизнес-аналитики, аналитики данных, MLOps-инженеры, DevOps-инженеры, Product-менеджеры, ИТ-архитекторы, UI/UX-дизайнеры.
На хакатоне ты сможешь:
— Выбрать свой трек и создать решение на базе ИТ-платформ МТС.
— Побороться за призовой фонд — 1 500 000 рублей.
— Расширить свои профессиональные связи через нетворкинг с участниками хакатона и экспертами МТС.
— Повысить шансы на прохождение стажировки в МТС.
— Узнать больше о продуктах и технологиях МТС от экспертов компании
Регистрация до 16 апреля.
Регистрируйся прямо сейчас: https://truetechhack.ru/
📈Плоские контейнеры и C++: как оптимизировать производительность и память
Пытаетесь сделать код быстрее и экономичнее? Время научиться использовать плоские контейнеры в C++! На открытом уроке 15 апреля в 20:00 мск мы разберемся, что такое плоские контейнеры!Что вас ждет:
- Описание плоских контейнеров в C++: какие они бывают и чем отличаются от стандартных.
- Реальные примеры, когда и почему плоские контейнеры — это ваша идеальная пара для эффективной работы с данными.
- Практическая часть: сравнение с традиционными контейнерами и примеры применения на реальных задачах.
Кому будет полезно:
• Программистам C++, работающим с большими объемами данных.
• Разработчикам высокопроизводительных приложений и игр.
• Инженерам, которым нужно минимизировать использование памяти и повысить эффективность.
👉Регистрируйтесь прямо сейчас и получите скидку на большое обучение «C++ Developer. Professional»: https://otus.pw/5z5c/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
⚡️ Linux теперь в Telegram!
Ребята сделали крутейший канал про Linux, где на простых картинках и понятном языке обучают работе с этой ОС, делятся полезными фишками и инструментами
Подписывайтесь: @linuxos_tg
Работа с файлами
Для того, чтобы прочитать файл, понадобится выполнить те же шаги, что и при записи, с небольшими изменениями:
1) создать объект класса ifstream и связать его с файлом, из которого будет производиться считывание;
2) прочитать файл;
3) закрыть файл.
string at()
std::string::at можно использовать для извлечения символов по символам из заданной строки.
Подробнее ознакомиться можно здесь.
🩸Выжить любой ценой: создаем арсенал в стиле Days Gone
На этом уроке вы научитесь создавать оружие для вашего персонажа. Мы разберем, как создать блупринт, добавить логику стрельбы и перезарядки, а также интегрировать оружие в управление персонажем. Вы узнаете, как настроить взаимодействие с оружием, чтобы оно выглядело и работало как в настоящей игре на движке Unreal Engine 5.
Основные темы:
- создание блупринта и добавление логики
- добавления оружия в персонажа
- настройка взаимодействия с оружием
👉 Регистрация и подробности о курсе "Unreal Engine Game Developer. Basic": https://otus.pw/kri6/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Принцип YAGNI
Принцип YAGNI (You Ain't Gonna Need It), который также известен как «Не добавляйте функциональность, пока она не понадобится».
В контексте С++ это означает, что при проектировании и разработке программы вы должны избегать лишней сложности, излишних функций и структур данных, которые не требуются на текущем этапе разработки. Вместо этого фокусируйтесь на решении актуальных задач и добавлении только тех функций, которые необходимы для выполнения текущих требований.
Этот принцип помогает избежать излишней сложности кода, упростить его поддержку и обеспечить более гибкую архитектуру, которая может легко адаптироваться к будущим изменениям и требованиям.
#для_продвинутых
Undefined behaviorUndefined behavior (неопределенное поведение) — это концепция в C++, которая означает, что результат выполнения определенного кода программы не определен и может быть непредсказуемым. Это означает, что в случае наличия undefined behavior в программе нельзя надеяться на какие-либо гарантированные результаты, и программа может вести себя по-разному в разных средах выполнения или даже в разные моменты времени.
Undefined behavior может возникать из-за различных причин, например делением на ноль, доступом к невыделенной памяти, выходом за пределы массива или использованием неинициализированных переменных.
#для_начинающих
❓ Знали, что разработчики на С++ тоже могут эффективно автоматизировать инфраструктуру с помощью Terraform и GitLab?
⏰ 3 апреля в 20:00 мск на открытом уроке Вячеслав Федосеев объяснит, как разработчикам на С++ настроить CI/CD-пайплайны, управлять конфигурациями и легко разграничивать окружения.
Вячеслав — эксперт в IT с 2006 года, прошёл путь от первых Linux-серверов до масштабных DevOps-решений. Автор и ментор курсов по CI/CD и DevOps-практикам.
Если вы С++ разработчик, хотите упростить инфраструктуру ваших проектов и ускорить процессы — урок точно для вас. Освойте актуальные практики IaC и получите навыки, которые повысят вашу востребованность.
🎁 Участникам вебинара дарим скидку на полный курс по CI/CD на основе GitLab.
👉 Для участия зарегистрируйтесь
https://otus.pw/bAGJ/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Принцип DRY
Принцип DRY (Don't Repeat Yourself) — это основной принцип программирования, который призывает избегать дублирования кода. Этот принцип подразумевает, что каждая часть информации или логики должна существовать в системе только в одном месте. В контексте С++ принцип DRY означает, что вы должны избегать повторения кода, функций, классов или любых других конструкций.
#для_продвинутых
#вопросы_с_собеседований
Как работает механизм перегрузки операторов в C++ и какие ограничения существуют при его использовании?
В C++, перегрузка операторов позволяет программистам определять поведение стандартных операторов (например, +, -, *, /) для пользовательских типов данных. Это делается путем определения функций или методов класса с специальным именем: operatorX, где X - это оператор, который нужно перегрузить. Однако существуют ограничения: нельзя перегружать операторы для встроенных типов данных (только если одним из операндов является пользовательский тип), нельзя создавать новые операторы, и некоторые операторы (например, ?:, .) не подлежат перегрузке. Перегрузка операторов должна использоваться с осторожностью, чтобы не нарушить интуитивные ожидания от работы этих операторов.
Концепт Derived
Концепт Derived в C++ используется для проверки того, является ли указанный тип производным от другого типа. Концепт имеет два шаблонных параметра: Derived и Base.
Концепт Derived удовлетворяется, если и только если Base является классом, который является либо Derived, либо публичным и недвусмысленным базовым классом Derived, игнорируя cv-модификаторы.
Например, код выше удовлетворяет концепту Derived.
#для_продвинутых
Нетворкинг, роботы, ретроигры: что ждет гиков и любителей железа на Repair Cafe от Яндекса
Именно люди с инженерным мышлением и тягой к изобретениям когда-то создали Яндекс. Теперь в компании работает более 30 тысяч экспертов, которые продолжают развивать десятки сервисов и создавать новое железо: роботов-доставщиков, умные устройства и не только.
Оказаться в атмосфере, полной новых идей, можно будет уже 25-26 апреля на Repair Cafe, где пройдет выставка, воркшопы, доклады и даже техносвоп.
Главной точкой притяжения на ивенте станет мастерская, в которой будет все для починки гаджетов. Опытные наставники помогут найти поломку, посоветуют, как ее устранить, и предложат для этого все необходимые инструменты.
На воркшопе можно будет разобрать самокат и изучить его изнутри, а еще собраться ностальгирующим комьюнити, починить легендарный ретро-компьютер «Ленинград» и запустить на нем культовые игры.
На передвижной выставке можно будет посмотреть артефакты из прошлого и будущего: роботов, серверы, лидары, игровые приставки. Все объекты интерактивны, их можно трогать и нажимать на кнопки.
Мероприятие бесплатное, но нужна регистрация.
set::erase()
Функция set::erase() используется для удаления элементов из контейнера set.
set::erase() принимает значение, которое нужно удалить, в качестве аргумента и удаляет из set все элементы, эквивалентные переданному значению.
Если такого значения нет в set, не делает ничего.
В этом примере создается set целых чисел, добавляются значения от 1 до 5. Затем вызывается numbers.erase(3) - это удалит элемент со значением 3 из set.
#это_база
std::find
std::find - это алгоритм из стандартной библиотеки, который ищет элемент в контейнере.
Он принимает 3 аргумента:
- Итератор на начало контейнера
- Итератор на конец контейнера
- Искомое значение
И возвращает итератор на найденный элемент или итератор на конец, если элемент не найден.
В примере мы ищем элемент со значением 3 в векторе vec. std::find возвращает итератор на найденный элемент, по которому мы выводим значение.
#вопросы_с_собеседований
В каком порядке инициализируются и уничтожаются члены класса?
Сначала вызываются конструкторы базовых классов в порядке наследования.
Затем инициализируются члены класса в порядке их объявления в классе.
После этого вызывается конструктор текущего класса.
Аналогичным образом происходит уничтожение объекта:
Сначала вызывается деструктор текущего класса.
Затем уничтожаются члены класса в порядке, обратном их инициализации.
Далее вызываются деструкторы базовых классов в обратном порядке наследования.