Библиотека C/C++ разработчика | cpp, boost, qt
21K subscribers
1.57K photos
40 videos
16 files
3.74K links
Все самое полезное для плюсовика и сишника в одном канале.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/d6cd2932

Наши каналы: https://yangx.top/proglibrary/9197

РКН: https://gosuslugi.ru/snet/67a5bac324c8ba6dcaa1ad17
加入频道
Принцип YAGNI

Принцип YAGNI (You Ain't Gonna Need It), который также известен как «Не добавляйте функциональность, пока она не понадобится».

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

Этот принцип помогает избежать излишней сложности кода, упростить его поддержку и обеспечить более гибкую архитектуру, которая может легко адаптироваться к будущим изменениям и требованиям.
#код
🤔 Очередной #дайджест по С++

Использование переменных шаблонов для решения крошечной задачи — как шаблоны переменных могут быть использованы для улучшения читаемости

Создавайте надежные и защищенные программы на C++ — как и какие инструменты использовать для создания

Язык Janet для смертных — раскрываются различные аспекты работы с языком, объяснение синтаксиса и некоторых приемов программирования

Структурированная диагностика в новом окне — рассказ о безумно полезном инструменте, о котором не все знают

Приключения ржавого — как выдрать экранчик из принтера и соорудить поделку😂
#вопросы_с_собеседования

Перед вами два примера кода для печати вектора. Есть ли преимущества использования одного или другого?

Пример 1:
c++
vector vec;
/* ... .. ... */
for (auto itr = vec.begin(); itr != vec.end(); itr++) {
itr->print();
}

Пример 2:
c++
vector vec;
/* ... .. ... */
for (auto itr = vec.begin(); itr != vec.end(); ++itr) {
itr->print();
}


Хотя оба кода будут генерировать одинаковые выходные данные, пример 2 является более производительным вариантом. Это связано с тем, что оператор после инкремента itr++ обходится дороже, чем оператор перед инкрементом ++itr.

Оператор пост-инкремента генерирует копию элемента, прежде чем приступить к увеличению элемента и возврату копии. Более того, большинство компиляторов автоматически оптимизируют пример 1, неявно преобразуя его в пример 2.
🚶👣 На пути из Web к Native

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

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

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

Бота выбрал по ряду причин:

Работа с ассемблером.
Какой-никакой GUI.
Сборка и импорт библиотеки.
Мечта детства.

Начал с реверсинга, попал на форум Tuts4You и прошел челлендж, состоящий из 40ка reverse_me.

Продолжение истории тут

#почитать
🤓🧑‍🎓 Синтаксический разбор CSV строчек

В программировании микроконтроллеров часто надо производить синтаксический разбор (парсинг) CSV строчек. CSV это просто последовательность символов, которые разделены запятой (или любым другим одиночным символом: ; | /).

1️⃣ CSV строчки можно, например, повстречать в NMEA протоколе от навигационных GNSS приемников. Вот пример NMEA протокола:

$GNGGA,102030.000,5546.95900,N,03740.69200,E,1,08,2.0,142.0,M,0.0,M,,*
$GNGLL,5546.95900,N,03740.69200,E,102030.000,A,A*
$GNGSA,A,3,10,16,18,20,26,27,,,,,,,4.8,2.0,4.3,1*
$GNGSA,A,3,19, , , , , ,,,,,,,4.8,2.0,4.3,4*
$GNGSA,A,3,82, , , , , ,,,,,,,4.8,2.0,4.3,2*


2️⃣ Потом, любой URL (например https://proglib.io/) это, в сущности, та же самая пресловутая CSV строчка, где разделитель это /.

3️⃣ Также компонент CSV позволит одной строчкой в UART-CLI консоли прошивки распознавать и запускать на исполнение последовательно сразу несколько shell команд.

4️⃣ Прошивка может запросто логировать на SD карту по SPI данные в CSV формате как в файл на FatFS. Потом этот текстовый *.csv файлик можно будет открыть на LapTop(е) любым процессором электронных таблиц.

Продолжение здесь
💹⚖️ Измерение частоты на STM32

Рассказ о различных методах измерения частоты прямоугольного сигнала с помощью микроконтроллера STM32.

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

Начальные условия: частота входного сигнала от 0 до 10 кГц. Микроконтроллер STM32F103C8T6, всем известная плата bluepill. Библиотека HAL. Источником сигнала, частота которого будет измеряться, для проверки работоспособности будет служить двухканальный генератор частоты JDS6600. Будет использовать модуль CH340G (Преобразователь USB — UART) для передачи данных в терминал (terminal v1.9b) для наглядности. В него будет посылаться полученное после обработки значение.

Читайте дальше тут

#туториал
std::array и std::vector

std::array — это обёртка вокруг обычного массива, фиксированного размера, а std::vector — это динамически расширяемый массив. std::array хранит свои данные в стековой памяти, а vector выделяет память в куче (динамическая память). У std::array в параметрах шаблона указывается тип хранимых элементов и размер массива. А у std::vector - тип элементов и ещё возможно указать аллокатор, который нужно использовать при выделении памяти (с помощью new). std::array чуть лучше по производительности в случае небольшого массива, чем std::vector, который содержит в себе несколько указателей, указывающих на выделенный в куче кусок памяти.
Что используется для ручного написания таблицы подстановки?
Anonymous Quiz
5%
std:find
49%
std:map
21%
std:lookup
21%
Ничего из вышеперечисленного
4%
Свой вариант
🤔 очередной #дайджест по С++

🟢 С++ производительность и щепотка безопасности — обсуждение того, за что программисты любят C++

🟢 Как сравнить целые числа со знаком и без знака — cравнивать два числа должно быть легко, не так ли? Возможно, так и должно быть, но не в C++

🟢 Устранение расхождений в истории git commit после операций переименования с учетом регистра — мучения с изменением значений git config core.ignorecase

🟢 Простая в реализации arena-friendly hash map — в статье демонстрируется методика создания хэш-мапов в сочетании с arena allocation

🟢 О хранении изображений в памяти с выравниванием — будет немножко кода на Си и ассемблере, пара LabVIEW скриншотов, а также базовые знания OpenCV
forward_list::splice_after()

Это встроенная функция в CPP STL, которая переносит элементы в диапазоне от first+1 до last из данного forward_list в другой forward_list. Элементы вставляются после элемента, на который указывает позиция в параметре.

Синтаксис:

forwardlist1_name.splice_after(position iterator, forwardlist2_name,first iterator, last iterator)


Параметры: функция принимает четыре параметра:

position – позиция в forward_list, после которой должны быть вставлены новые элементы.
forwardlist2_name – список, из которого должны быть вставлены элементы.
first – итератор, после которого должна быть выполнена вставка.
last – итератор, до которого должна быть выполнена вставка.
🎢🚀 Диспетчер задач для микроконтроллера

В программировании микроконтроллеров часто нужно написать простые тестировочные прошивки. При этом надо некоторые функции вызывать чаще, а некоторые реже.

Для этого конечно можно запустить FreeRTOS, однако тогда код не будет переносим на другие RTOS, например Zephyr RTOS/TI-RTOS/RTEMS/Keil RTX/Azure RTOS или SafeRTOS. Потом прошивку как код часто приходится частично отлаживать на PC а там никакой RTOS в помине нет.

Поэтому надо держать наготове какой-нибудь простенький универсальный переносимый кооперативный NoRTOS планировщик с минимальной диагностикой и возможностью в run-time отключать какие-то отдельные задачи для отладки оставшихся.

Проще говоря нужен диспетчер задач для микроконтроллера.

Углубленный разбор ожидает тут
🧑‍🍳📊 The Ranges Library в C++20

Благодаря библиотеке ranges работа с библиотекой STL стала намного удобнее. Прежде всего, алгоритмы библиотеки ranges ленивы, могут работать непосредственно с контейнером и могут быть закомпожены. Кроме того, библиотека ranges имеет несколько уникальных дизайнерских решений.

Непосредственно в контейнере

Библиотека ranges позволяет контейнеру, такому как std::ranges::sort, напрямую работать с контейнером.
Напротив, классический std::sort работает с диапазоном, определенным двумя итераторами: std:sort(myVec.begin(), myVec.end()).

Продолжение истории вот

#гайд
🧑‍💻 Обработка строковых литералов во время компиляции

С момента добавления constexpr можно многое делать во время компиляции. Одной из таких вещей является обработка строковых литералов.

Поиск строк в бинарнике

Если вы объявите переменную типа const char* str = «Hello World»;, строка «Hello World» будет в бинарнике.

В Linux, macOS и Windows есть команда strings. (для Windows необходимо установить Sysinternals Suite)

Запуск strings [your_binary] выведет список всех строк — «Hello World» должен быть среди них.

Далее примеры кода и несколько фишек

#гайд
🤔🎯 Что нового в .NET 8

.NET 8 вышел в релиз, значит можно начинать переносить свои проекты на новую версию. В этой статье рассматриваются новые улучшения и фишки: производительность, Native AOT, GC, новые типы, направленные на повышение производительности, NuGet Audit и прочее.

Производительность

Microsoft сказали, что представленный в прошлом году .NET 7 очень быстрый, но .NET 8 быстрее. Усовершенствования коснулись: JIT, GC, рефлексии, коллекции, LINQ, кодогенерации, сериализции и десериализции, примитивных типов и многого другого.

Native AOT

Native AOT использует ahead of time компилятор для компиляции IL в машинный код во время публикации self-contained приложения. В .NET 8 добавлена поддержка архитектур x64 и arm64 на macOS.

Native AOT приложения включают в себя .NET runtime. Исходя из этого, они имеют больший размер по сравнению с обычными приложениями. В .NET 8 улучшили и этот аспект.

Рассмотрение других ништяков релиза — вот

#почитать
🤔 очередной #дайджест по С++

📥 Анализ приложений на C++ для оптимизации производительности — введение в анализ производительности программ на C++

📥 Стремление к улучшению кода на C++ — что такое анализ потоков данных, и какие ошибки может находить CLion

📥 C++23: Удаление поддержки сборки мусора — сказ о поддержке сборки мусора, включенной в C++11 и окончательно удаленной в C++23

📥 C++23 chunk view и stride view — видео о новых представлениях (views), добавленных в C++23

📥 Шаблоны для уменьшения размера бинарника — использовании extern template для сокращения размеров бинарных файлов
Как можно получить доступ к функциям-членам в контейнере?
Anonymous Quiz
53%
Iterator
13%
Indirect
15%
Оба варианта
15%
Ничего из вышеперечисленного
3%
Свой вариант