IT Kniga
Интернет-магазин компьютерной литературы

C++ - habr.ru

RSS-материал Хабр
C++ – типизированный язык программирования
Обновлено: 4 часа 58 минуты назад

Пишем калькулятор на C++ с SFML

Вс, 16/03/2025 - 16:01

Привет, коллеги и доброжелательные критики! Сегодня я решил отвлечься от своей громоздкой работы, чтобы написать что-то простое, но с изюминкой — калькулятор с графическим интерфейсом на C++20 и SFML. Этот проект — не претензия на что-то грандиозное, а скорее лёгкий эксперимент, чтобы вспомнить, как приятно писать код, который сразу видно на экране. Заодно я поделюсь с вами своими мыслями, подходами и парой советов. Давайте разберём, как я это закрутил и почему выбрал именно SFML.

Читать далее
Категории: C, C++

Machine learning на ESP32

Вс, 16/03/2025 - 12:10

Распознавание жестов — это технология, которая позволяет людям взаимодействовать с устройствами без физического нажатия кнопок или сенсорных экранов. Интерпретируя жесты человека, эта технология нашла свое применение в различных потребительских устройствах, включая смартфоны и игровые консоли. В основе распознавания жестов лежат два ключевых компонента: сенсор и программный алгоритм.

В этом примере используются измерения акселерометра MPU 6050 и машинное обучение (ML) для распознавания трех жестов рукой с помощью ESP32. Данные из сенсора распознаются на микроконтроллере и результат выводится в консоль в виде названия жеста и вероятности результата. Модель ML использует TensorFlow и Keras и обучается на выборке данных, представляющей три различных жеста: "circle" (окружность), "cross" (пересечение) и "pad" (поступательное движение).

Разработка проекта начнется с получения данных из акселерометра для построения набора жестов. Затем мы проектируем полносвязную нейронную сеть для распознавания жестов, и подключим модель в проекте ESP32.

В следующей части рассмотрим как настроить Bluetooth LE (BLE) на ESP32 и Android устройстве. Передадим квантированный набор ускорений сенсора по BLE. Настроим Модель ML для распознания жестов на Android.

Читать далее
Категории: C, C++

[Перевод] Быстрая свёртка множеств (алгоритм)

Вс, 16/03/2025 - 06:24

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

Статья будет интересна тем, кто интересуется нетривиальными, но красивыми алгоритмами!

Читать далее
Категории: C, C++

ProxyOrmModel — ORM-подход к работе с данными в Qt

Сб, 15/03/2025 - 07:19

Привет, Хабр! В этой статье я хочу рассказать о своём проекте — библиотеке ProxyOrmModel для Qt, которая упрощает работу с данными в моделях. Если вы когда-нибудь сталкивались с необходимостью фильтровать, сортировать, группировать или агрегировать данные в QAbstractItemModel, то, вероятно, знаете, как это может быть утомительно. Я решил создать инструмент, который делает это проще и удобнее, вдохновившись идеями ORM (Object-Relational Mapping) из мира баз данных. Здесь я поделюсь архитектурой, ключевыми классами и уроками, которые я вынес из разработки.

Читать далее
Категории: C, C++

Лампа для подсветки рассады или просто таймер. Конструкция выходного дня

Сб, 15/03/2025 - 06:15

Контроллер Лампы для Рассады

Умный контроллер освещения на базе ESP32 с управлением через Telegram бот. Проект выходного дня для любителей растениеводства.

Читать далее
Категории: C, C++

[Перевод] Ложные убеждения о нулевых указателях

Пт, 14/03/2025 - 12:14
В этой статье предполагается, что вы знаете, что такое неопределённое поведение, и почему его не следует провоцировать, в самом общем виде знаете, как работают процессоры, а также умеете принимать во внимание конкретный контекст, не злоупотребляя излишним обобщением частностей. Эти убеждения можно считать заблуждениями, так как они не применяются глобально, а не потому, что обратное от них действует глобально. Если вы не уверены в себе, то, возможно, от прочтения этого текста вы больше проиграете, тем самым подпортив себе навыки программной инженерии. Поэтому ничего страшного, если вы не будете знакомиться с постом, а просто почитаете комментарии на Reddit — там уже написали, что может пойти не так, если вы, несмотря ни на что, углубитесь в этот материал.
На первый взгляд нулевые указатели кажутся простыми, и именно поэтому они так опасны. По мере того, как накапливаются компиляторные оптимизации, логичные на первый взгляд, но неверные упрощения, а также причуды конкретных платформ, вы всё сильнее рискуете сделать неверное допущение. Из-за этого в коде множатся баги и уязвимости. Читать дальше →
Категории: C, C++

Линейный криптоанализ. Как работает современное шифрование. Часть 1/2

Пт, 14/03/2025 - 09:45

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

В качестве изучаемого шифра возьмем сильно упрощенную версию шифра DES и AES. Шифр AES является одним из самых распространённых алгоритмов симметричного шифрования. Любой современный процессор поддерживает аппаратное ускорение алгоритма AES.

Читать далее
Категории: C, C++

Психология разработки: как когнитивные искажения влияют на архитектурные решения и качество кода (часть 2)

Втр, 11/03/2025 - 16:31

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

В этой статье мы продолжим изучение темы, начатой в первой части, и рассмотрим, как когнитивные искажения — отклонения от рационального мышления — подрывают качество кода, замедляют разработку и становятся источником дорогостоящих ошибок.

Читать далее
Категории: C, C++

Тёмный лес разработки для нестандартных устройств: как войти и не заблудиться

Втр, 11/03/2025 - 09:12

Если разработку под устройства можно сравнить с тёмным лесом, то как в нём не заплутать?

Привет, путник! Меня зовут Денис Малых, я работаю в Яндексе и руковожу разработкой общих компонент для платформы, на которой работают наши устройства. А ещё — я член программного комитета конференции AppsConf, где мы обсуждаем разработку под мобильные ОС. В этой статье поделюсь опытом разработки под нестандартные устройства: чем она принципиально отличается от привычной мобильной разработки, и что нужно уметь, чтобы разрабатывать «умные вещи».

Читать далее
Категории: C, C++

Использование неполных объявлений в C++

Втр, 11/03/2025 - 07:33


Продолжаем серию «C++, копаем вглубь». Цель этой серии — рассказать максимально подробно о разных особенностях языка, возможно довольно специальных. Это восьмая статья из серии, список предыдущих статей приведен в разделе 6.


C++ относится к языкам со статической типизацией, то есть тип переменных определяется на стадии компиляции, но в ряде случаев компилятору для компиляции без ошибок достаточно знать, что то или иное имя является именем какого-то пользовательского типа (класса, структуры, объединения, перечисления), а полное объявление типа не нужно. В этом случае можно использовать неполное объявление (incomplete declaration), называемое еще упреждающим или предваряющим (forward declaration). Типы с неполным объявлением называются неполными.


Использование неполных объявлений позволяет решить ряд проблем, традиционно свойственных коду, написанному на С++. Отметим следующие:


  1. Можно уменьшить количество включений заголовочных файлов в другие файлы проекта, что сокращает время компиляции, снижает замусоривание пространств имен неиспользуемыми именами, предупреждает потенциальные конфликты имен;
  2. Можно реализовать решения, полностью разделяющие интерфейс и реализацию (непрозрачные указатели);
  3. Можно разрывать циклические зависимости;
  4. Можно снизить использование нетипизированных указателей void*, что повышает надежность и читаемость кода.

Грамотное использование неполных объявлений — один из признаков профессионального кода.

Читать дальше →
Категории: C, C++

Сериализованные справочники: работа без десериализации

Пнд, 10/03/2025 - 14:04

Справочники, или словари — обычно большие объёмы статических данных, адресуемые и не модифицируемые при работе программы. Как правило, подготавливаются или загодя, при разработке, или вне программы, или в специальных её режимах. Зачастую с ними обращаются как с обычными структурами, однако можно организовывать их и иначе — так, чтобы работа с ними шла вообще без резервирования памяти и каких‑либо лишних операций, а в памяти они занимали минимально возможный объём.

Читать далее
Категории: C, C++

Психология разработки: как когнитивные искажения влияют на архитектурные решения и качество кода (часть 1)

Вс, 09/03/2025 - 00:43

"Это простой фикс, займет максимум час", — говорите вы в пятницу днем. В понедельник вечером вы всё ещё боретесь с тем же багом, проклиная свой оптимизм и чувствуя, как горит дедлайн.

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

Наш мозг — не идеальная машина для написания кода. Миллионы лет эволюции создали его для выживания в саванне, а не для проектирования микросервисных архитектур или оценки спринтов. Когнитивные искажения — это сбои в нашем мышлении, систематические ошибки, которые влияют на каждое решение, от оценки времени на задачу до выбора архитектуры приложения.

Читать далее
Категории: C, C++

Визуализация быстрой сортировки с SFML и C++20

Сб, 08/03/2025 - 16:45

В этой статье мы создадим интерактивную визуализацию алгоритма быстрой сортировки (QuickSort) с использованием библиотеки SFML и современных возможностей C++20. Этот проект поможет вам лучше понять, как работает один из самых популярных алгоритмов сортировки, и покажет, как можно комбинировать графику и алгоритмы для создания образовательных инструментов.

Читать далее
Категории: C, C++

О формальном доказательстве безопасной работы с памятью на основе «владения и заимствования»

Пт, 07/03/2025 - 14:55


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


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


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

Читать дальше →
Категории: C, C++

Где найти ментора в IT и как не наткнуться на «псевдонаставника»?

Пт, 07/03/2025 - 14:23

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

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

Читать далее
Категории: C, C++

Ещё одна сериализация для C++

Пт, 07/03/2025 - 10:47

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

Хотя инструментов для сериализации существует достаточно много, я предлагаю вашему вниманию ещё один. Он не лучше и не хуже других, и был создан с акцентом на простоту (кто бы мог подумать?) и компактность (опять же!), не сильно влияющую на производительность работы с ранее сериализованными данными.

Читать далее
Категории: C, C++

N-API: аддоны для Node.js

Чт, 06/03/2025 - 19:02

Привет, Хабр!

В этой статье рассмотрим то, как создаются нативные аддоны для Node.js на C++ с использованием N-API.

До появленияN‑API написание аддонов шло напрямую через V8 API, что влекло за собой жёсткую привязку к конкретной версии движка. Каждый апдейт Node.js требовал пересборки и правки кучи низкоуровневого кода. N‑API решает эту проблему, предоставляя стабильный ABI. Это позволяет писать универсальные, долговечные и, главное, поддерживаемые модули, не боясь, что обновление Node.js подбросит вам сюрприз в виде «segmentation fault».

Читать далее
Категории: C, C++

Не покупайте грузовик для похода за хлебом и другие принципы программирования

Чт, 06/03/2025 - 13:15

Мне недавно встретился код вывода количества FPS на экран, написанный начинающим программистом, и в этом коде был базовый класс, класс-потомок, виртуальные функции, конструктор с множеством параметров, variant. Код позволял выводить любое количество счетчиков FPS на экран разными шрифтами, но все, что было на самом деле нужно, это простая функция на 3 строки, считающая количество FPS и выводящая его на экран.

Читать далее
Категории: C, C++

std::array в С++ быстрее массива в С. Иногда

Чт, 06/03/2025 - 09:47

Давайте натрём наши болиды до блеска и посмотрим, как они входят в повороты компиляторных оптимизаций на примере использования std::array. Смогут ли они не только не уступить, но и обогнать встроенный массив?

Поехали!
Категории: C, C++

Линейная алгебра в C++ с Eigen

Ср, 05/03/2025 - 12:12

Привет, Хабр!

Кто хоть раз пытался работать с матрицами в C++, знает, что это удовольствие сродни написанию своего STL — возможно, но зачем? Eigen — это библиотека, которая избавит вас от ручного управления памятью, оптимизирует вычисления и позволит писать код, похожий на чистую математику. Поэтому в этой статье мы разберем эту прекрасную библиотеку.

Читать далее
Категории: C, C++

Большая распродажа компьютерной литературы

Полный список здесь