Обновить
220.08

C++ *

Типизированный язык программирования

Сначала показывать
Порог рейтинга
Уровень сложности

Подводные камни компараторов в С++

Время на прочтение9 мин
Охват и читатели13K
При использовании компаратора в алгоритмах boost::sort и std::sort важно учитывать некоторые особенности работы этих алгоритмов, игнорирование которых может привести к неожиданным последствиям, в том числе к segmentation fault.

image

Чаще всего при сортировке объектов пользовательских типов написание кода сравнения элементов коллекции не вызывает вопросов. Компаратор должен возвращать true, если первый аргумент меньше второго, то есть в отсортированном массиве первый аргумент должен идти перед вторым. Алгоритмы сначала вызывают компаратор для пары элементов x и y. Если компаратор вернул true, значит, элемент x меньше y и он должен идти в коллекции перед элементом y, если false, то компаратор вызывается повторно для пары y и x. Если компаратор опять вернул false, значит, элементы равны, иначе порядок определен.

Меня зовут Олег Игнатов, я — Development Team Lead в команде KICS (Kaspersky Industrial CyberSecurity) «Лаборатории Касперского». Мы защищаем промышленные инфраструктуры и сети от специализированных киберугроз. В этой статье расскажу о некоторых особенностях использования компараторов в С++, знание которых позволит не наступить на различные грабли и сэкономить время при разборе багов.
Читать дальше →

Неполная, неточная и наполовину выдуманная история исключений

Время на прочтение9 мин
Охват и читатели8.4K

Давным-давно, когда деревья были маленькие, дискеты большие, а трава зеленая, все писали на языках низкого уровня. В этих языках все было целыми числами. Переменные были числами, массивы были и структуры были просто адресами (числами) и смещениями (тоже числами). Даже если указывали тип данных, то он определял только размер памяти для значения.

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

Чтобы программа не грохалась, а выдавала осмысленное сообщение и давала возможность продолжить работу, надо было добавить проверку.

Читать далее

Размышление об Active Object в контексте Qt6. Часть 3. HttpManager

Время на прочтение10 мин
Охват и читатели2.3K

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

Пришло время, наконец, сделать что-то более реальное и существенное, пусть и не очень сложное. И этим будет менеджер http запросов.

Читать далее

Размышление об Active Object в контексте Qt6. Часть 2.5

Время на прочтение5 мин
Охват и читатели4.1K

Статья выпущена как дополнение к предыдущей и показывает, как можно сделать Active object, работающий асинхронно в среде Qt, но при этом не использующий события.

Читать далее

C++ по итогам 2022-го

Время на прочтение15 мин
Охват и читатели33K

Должен признать, что в некоторые из предыдущих лет C++ мог ощущаться немного «скучным» и «стабильным». Новые фичи, новый стандарт каждые три года, встречи, конференции... обычная жизнь (не считая некоторых дополнительных событий с в мире, экономике и эпидемиологической ситуации). Прошедший год отличается, потому что выглядит как «переломный» в истории C++... и кто знает, куда это заведёт нас.

Давайте вспомним некоторые вещи, случившиеся в прошедшем году.

Читать далее

SuperIndustry — Dev log #1 – Большой и страшный монстр по имени C++

Время на прочтение4 мин
Охват и читатели5.8K

Вступление

Привет, друзья! В этом цикле статей я максимально подробно буду рассказывать о процессе разработки игры на UE – SuperIndustry. Вы сможете на моем примере познать процесс разработки 3D игры на UE. Вкратце про игру: Представьте гибрид Oxygen not included и Satisfactory, в далеком будущем и на специфичной экзо планете. В игре будет глубокий сюжет, который будет повествоваться через своеобразный дневник. Главная цель – улететь с планеты (остановиться на достигнутом) или же продолжить общение с высшим Существом и узнать, что будет дальше.

Предыдущая часть.

Читать далее

Размышление об Active Object в контексте Qt6. Часть 2

Время на прочтение4 мин
Охват и читатели2.8K

Пришло время написать вторую часть статьи. На этот раз мы рассмотрим нечто, к чему вы скорее всего придёте, работая над многопоточным кодом с использованием Qt.

Читать далее

Меньше точно не бывает! Делаем вольтметр на ATTINY10

Время на прочтение4 мин
Охват и читатели24K

В продолжение к прошлой статье решил пощупать и Attiny10. Ну меньше уже точно ничего нет. Если и есть такое извращение с 4 ногами, я о нем не знаю, точнее не нашел.

Тут у нас полноценный МК, в корпусе SOT-23! И задачи на нем решать можно вполне серьезные. Собрав схему на макетке, с МК на адаптере и модулем дисплея я было обрадовался, но готовая плата работать отказалась...

Читать далее

Игровое меню SFML C++

Время на прочтение7 мин
Охват и читатели18K

Предыдущая тема

Используя графические объекты библиотеки SFML С++, создаём прототип игрового меню. Для практического использования, игровое меню разработано в виде класса GameMenu, который можно подключить к своему проекту через заголовочный файл.

Читать далее

Размышление об Active Object в контексте Qt6. Часть 1

Время на прочтение5 мин
Охват и читатели6.3K

На дворе четыре часа ночи. В душе не понимаю, зачем я это пишу, чего я хочу этим добиться, и т.д. Если вкратце, то это будет цикл статей из разряда "хоба, как могу", причём это самое "хоба" зачастую слишком очевидно и элементарно, да и далеко не всегда полезно, особенно, в контексте философии Qt. Так что это будут просто "размышления обо всём".

Читать далее

Происхождение и эволюция аллокатора памяти в С

Время на прочтение11 мин
Охват и читатели26K

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

Аллокатор памяти в С - именно тот случай, когда при попытке ознакомиться с его современным устройством возникает стойкое желание остановиться, мысленно поблагодарить авторов и далее обращаться как с черным ящиком. Если же в читателе сильна любознательность, и/или есть желание постигнуть тайное знание, которое даст ощущение понимания странного поведения программ в нетривиальных случаях, добро пожаловать под кат.

Читать далее

Говорящая книга: четверть века спустя

Время на прочтение11 мин
Охват и читатели3K

Четверть века назад в издательстве Addison-Wesley вышел мой первый CBT (Computer Based Training) - учебник по Visual C++ 5 [1]. 

Это был один из первых в Западной Европе фундаментальных мультимедиальных образовательных проектов. 

Четверть века - это повод вспомнить, как этот проект появился на свет, а также поразмышлять о том, как развилась отрасль за эти годы. А заодно и попытаться найти ответ на вопрос - в какой мере компьютеры и Интернет могут помочь обучению. Например - обучению языкам программирования и связанным с ними технологиям. 

Читать далее

Современные возможности C++ и проверенные паттерны: активный объект, внешний полиморфизм и корутины

Время на прочтение14 мин
Охват и читатели19K

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

Читать далее

Ближайшие события

Изучение физического движка Bullet

Время на прочтение8 мин
Охват и читатели14K

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

Читать далее

Цена ошибки

Время на прочтение6 мин
Охват и читатели3.3K

Продолжим. Наша текущая цель - на примере  аттракторов достичь равенства результатов в SimInTech  и ВКПа.  Делать мы это будем приведением моделей к наиболее универсальной базе - используя языки программирования (ЯП). В ВКПа уже есть реализация на С++. Осталось создать ее в SimInTech. В таком виде они будут соответствовать друг другу. А в идеале, если языки одинаковые, даже просто совпасть. Все это должно способствовать равенству результатов. И на этом пути, кроме освоения внутреннего языка программирования SimInTech,   особых препятствий не предвидится.

Блоки на внутреннем ЯП в SimInTech создаются на базе блока PL  - блок библиотеки Динамические. Напомним реализацию модели аттрактора Лоренца на стандартных библиотечных блоках. Она приведена на рис. 1. Далее мы ее будем называть исходной схемой. Часть ее вместе с соответствующим кодом на языке программирования SimInTech (LangBlock22) представлена на рис. 2.

Читать далее

Меньше, еще меньше! Делаем вольт-ампер-ватт метр на Attiny85

Время на прочтение4 мин
Охват и читатели21K

Ну вот наконец добрался до Attiny85, все хотел чего-нибудь сделать на них. А тут коллеги решили с гальваническими покрытиями поиграться. Путем нехитрых доработок блок питания для светодиодных дисплеев на 5В 60А стал регулируемым. А вот контролировать такие токи нечем. Шунт на 75мВ при 50А в местных магазинах мы нашли, а вот головку к нему нет, а стоять считать чего там милливольты показывают на мультиметре- такое себе.

Читать далее

Boson — разработка СУБД «с нуля» (часть I)

Время на прочтение9 мин
Охват и читатели22K

После разработки виртуальной машины и компилятора в рамках хобби прошел год и захотелось попробовать реализовать ёмкий по алгоритмам проект по системному программированию.

Каждый разработчик "кровавого" enterprise в своей работе использует СУБД (SQL/NoSQL) и меня всегда искренне интересовало как они устроены в самом сердце, на самом низком уровне. Почитав документацию и исходный код SQLite и MongoDB, про используемые в индексах и интерпретаторах запросов алгоритмы, осознал, что несмотря на широкую распространенность и некую привычность, системы управления базами данных (СУБД) - это сложные программные продукты, реализация которых не всем под силу. Отлично - как раз то, что мне надо. С мотивацией разобрались, перейдем к делу.

Итак, для начала хорошо бы сформулировать высокоуровневую спецификацию требований. Boson - это легкая, встраиваемая документоориентированная база данных на С/С++

Читать далее

Алгоритмы диапазонов C++20 — сортировка, множества, обновления C++23 и прочее

Время на прочтение9 мин
Охват и читатели6.9K


Эта статья — третья и последняя в мини-серии об алгоритмах диапазонов. Мы рассмотрим некоторые алгоритмы сортировки, поиска и другие, а также познакомимся с готовящимися крутыми улучшениями этих алгоритмов в версии C++23. Поехали! Подробности — к старту курса по разработке на С++.

Читать дальше →

Алгоритмы диапазонов C++20 — 11 модифицирующих операций

Время на прочтение14 мин
Охват и читатели7.5K


В предыдущей статье серии «Диапазоны» я рассмотрел основы и некоторые немодифицирующие операции. Сегодня пришло время таких алгоритмов, как transform, copy, generate, shuffle и многих других… даже rotate. Подробности — к старту курса по разработке на С++.


Прежде чем мы начнём


Ключевые наблюдения об алгоритмах std::ranges:

Читать дальше →