Приглашаю вас в небольшое приключение выходного дня, в котором никто никому ничего не будет доказывать. Мы просто будем реализовывать один и тот же несложный алгоритм, разыскивающий простые числа в некотором диапазоне, на нескольких языках программирования: C, C++, Scheme и Python - и смотреть, что этим кодом могут сделать современные оптимизирующие компиляторы. В процессе приключения мы увидим, что «динамический» не означает «совсем уж медленный», и посмотрим на приёмы программирования на Scheme, что, как мне кажется, можно сравнить с путешествием на экзотический остров.
![](http://webcf.waybackmachine.org/web/20220403214021im_/https://habrastorage.org/getpro/habr/hub/01b/2ed/295/01b2ed29584e1245479ca857b0264ff1.png)
C++ *
Типизированный язык программирования
Новости
Реализуем подобие DMA на микроконтроллерах AVR
![](https://webcf.waybackmachine.org/web/20220403214021im_/https://habrastorage.org/getpro/habr/upload_files/bf5/52a/931/bf552a93101bfe84d6d83ff0aef40268.png)
Всем привет. Довелось мне писать довольно большой проект на AVRках. Как известно у них не очень большие скорости 16 МГц, у тех же STM32 можно гнать 72МГц и выше. Но опыта на STM мало, по этому пока AVR. Так вот мне нужно было в проекте передавать данный по UART, посылки не большие 10-15 байт, скорость 9600. Если все это дело реализовать в основном цикле, то это очень сильно тормозит систему. А у меня помимо этого есть еще куча других задач. Единственный выход использовать прерывания. Посмотрел несколько примеров в интернете, некоторые из них сложные, другие я даже не понял как работают, и по итогу сделал как понимал, и теперь делюсь с вами.
И так в первую очередь нам необходимо сформировать то что хотим отправить, то есть получить буфер для отправки, не важно как sprintf или itoa. Допустим определим буфер:
Динамические структуры в shared-памяти
Приветствую, читатель! Хотелось бы осветить свою небольшую библиотеку для C++, которая призвана помочь Вам создавать динамические структуры в shared-памяти. Далее - под катом.
Работа в Highload командах 1С сейчас: Java/С++/ C#/TS/JS Hiring day
![](https://webcf.waybackmachine.org/web/20220403214021im_/https://habrastorage.org/getpro/habr/upload_files/fa9/f62/093/fa9f62093fca6e4cdc17f13033bfae6c.png)
Вечером 30 марта 2022 года (среда) в формате онлайн мы проводим Java/С++/ C#/TS/JS Hiring day.
Приглашаем всех заинтересованных в разработке на Java, С++, C#, JS, TS принять участие!
На митапе в течение часа мы расскажем:
• О разработке различных механизмов платформы корпоративных и облачных приложений, их внутреннем устройстве и принципах работы
• Опыте разработки highload-решений, которые ежедневно используют миллионы людей
Обнаружение наличия функциональности в C++ на этапе компиляции
![](https://webcf.waybackmachine.org/web/20220403214021im_/https://habrastorage.org/getpro/habr/upload_files/315/643/bc6/315643bc678b90bbf7d2ffd70f1f751d.png)
Иногда, при реализации очередной "шаблонной магии" очень хочется на этапе компиляции иметь сакральное знание о том, а если у типа нужный метод, чтобы его вызвать или нет?
Хорошо, если есть поддержка концептов или рефлексии. А что делать, если их ещё нет, или они не в полной мере поддерживаются?
В этой статье хотелось бы кратко рассмотреть особенности применения известного механизма обнаружения наличия функциональности у используемых типов данных на этапе компиляции.
Как начать писать программный код Си в ОС Linux (Руководство для совсем начинающих)
![](https://webcf.waybackmachine.org/web/20220403214021im_/https://habrastorage.org/getpro/habr/upload_files/478/49a/436/47849a436c5555ca62a414f46b3c75c1.png)
Этот материал рассчитан на людей, будущих программистов, которые только начинают разбираться в программировании под ОС Linux, или может быть долго были пользователями ОС Windows. Я попробую здесь показать прямое руководство к действию на примере ОС Ubuntu и тех простых инструментов, которые использовал некогда сам при изучении Си в процессе знакомства с Linux.
C/C++ из Python (ctypes) на Android
![main](https://webcf.waybackmachine.org/web/20220403214021im_/https://habrastorage.org/webt/yj/-c/sm/yj-csmwltho22f1-38_w8exbryu.jpeg)
Ранее я писал статью C/C++ из Python (ctypes), в ней описывается процесс запуска на Linux. На этот раз мне понадобилось повторить это уже на Android. В этой статье речь пойдет о сборке, необходимых инструментах, механизмах отладки и установки.
Кто такой Thread Pool и как его написать своими руками на С++
![](https://webcf.waybackmachine.org/web/20220403214021im_/https://habrastorage.org/getpro/habr/upload_files/873/ad2/37c/873ad237c0308fcc287b15b70d035fed.jpeg)
Thread Pool достаточно популярный паттерн в программировании, с которым рано или поздно сталкивается каждый первый программист. Если вы новичок и не хотите бездумно пользоваться пулом потоков, то эта статья поможет вам разобраться с его устройством и написать наивные реализации с использованием С++ 14 и С++ 17. Так же статья будет полезна всем, кто изучил теорию по многопоточности, но не знает как можно применить свои знания.
Спортивное программирование: не все так просто, как кажется
Меня зовут Абай Баймуканов, я – разработчик-алгоритмист международной IT-компании Relog. Уже несколько лет увлекаюсь олимпиадными программированием, поэтому в этой статье хотел бы поделиться своим видением по этому поводу.
Быть олимпиадником по спортивному программированию довольно весело и интересно. Но быть жюри и составителем задач для самих олимпиад – достаточно ответственное и не менее интересное дело. Спортивное программирование - это те же математические задачки на логику, которые всего то нужно решить. Но программирование, в отличие от любого другого предмета, уникально тем, что решение нужно еще и реализовать в виде компьютерной программы.
Здесь есть свой нюанс: программа может работать настолько долго, сколько не существует даже вселенная, а может сработать за долю секунды. Причем в обоих случаях результат будет один и тот же. Любой олимпиадник стремится к тому, чтобы его программа была как можно эффективнее. Для этого существуют алгоритмы и структуры данных - методы, позволяющие сделать определенные программы более эффективными с точки зрения необходимого времени или памяти компьютера.
Спектр сложности у задач по спортивному программированию достаточно широкий: от задач для новичков до задач мирового уровня для вундеркиндов. Большинство соревнований проводится практически одном и том же формате, то есть дается несколько задач, на их решение 5 часов и за это время нужно решить как можно больше.
На школьных олимпиадах обычно за каждую задачу можно получить от 0 до 100 баллов и общим результатом будет суммарный балл за все задачи, у студентов в результат идет просто количество решенных задач, а если есть участники, решившие одно и то же количество задач, то они группируют по убыванию штрафа. Чем дольше решаешь задачу или чем больше на них нужно попыток решить, тем больше штрафов за нее получишь.
Моделирование упаковки с использованием API SolidWorks
![image](https://webcf.waybackmachine.org/web/20220403214021im_/https://habrastorage.org/webt/iq/i5/oa/iqi5oac8qnnojmkastlgu4mdhja.jpeg)
В качестве иллюстрации этого утверждения приведем пример, в котором с такой задачей столкнулись даже IT-специалисты. Как раз на момент написания этой статьи программисты одного из подразделений ООО «Специальный технологический центр» занимались подбором комплектующих для комплекса радиоэлектронной аппаратуры, в состав которого входили серверы и автоматизированные рабочие места. Мне как конструктору в этот момент пришлось принять участие в выборе тары для укладки ЗИП (первое изображение под катом). Как могут решаться подобного рода задачи – см. далее.
Скрытые друзья в плюсах
Как известно, ключевое слово friend в C++ используется для предоставления доступа к закрытым членам класса внешним функциям и классам. Помимо этого, friend наделена еще одной фишкой, о которой знают далеко не все. В этой статье речь пойдет о hidden friends. Желающих разобраться в сабже, прошу под кат.
Обобщенное программирование – обзор реализаций
![](https://webcf.waybackmachine.org/web/20220403214021im_/https://habrastorage.org/getpro/habr/upload_files/c6e/986/597/c6e986597affbbc5caf64bd07add512f.jpeg)
В большинстве сильно типизированных языков поддерживается обобщенное программирование. Круг проблем, которые решаются на этих языках, один и тот же, но сами проблемы решались в разное время разными способами, и у каждого из этих способов были свои «за» и «против». Мы рассмотрим историю реализаций обобщенного программирования, чтобы вы могли распробовать его как инженер. Наилучшего подхода не существует, любой подход – это всегда компромисс, при котором одними преимуществами жертвуют ради других. Мы рассмотрим три популярных языка, обогативших нашу индустрию новыми подходами: C++, Java, C#(.Net). Для каждого из рассматриваемых языков мы ответим на следующие вопросы:
Шаблоны C++: как итерировать по std::tuple — std::apply и еще пара приемов
![](https://webcf.waybackmachine.org/web/20220403214021im_/https://habrastorage.org/getpro/habr/upload_files/327/f2c/a99/327f2ca99efdaf5baf09ea5ddda940df.png)
В предыдущей статье, посвященной перебору элементов кортежей, мы рассмотрели только основы. В результате нашей работы мы реализовали шаблон функции, который принимал кортеж и мог красиво вывести его в консоль. Мы также реализовали версию с оператором <<
.
Сегодня мы пойдем немного дальше и рассмотрим другие техники. Первая — с применением std::apply
из C++17, вспомогательной функции для кортежей. В этой статье также будут рассмотрены некоторые стратегии, позволяющие сделать итерацию более универсальной и обрабатывать кастомные callable-объекты, а не только выводить их в консоль.
Простая программная генерация видео и картинок без стороннего API
![](https://webcf.waybackmachine.org/web/20220403214021im_/https://habrastorage.org/getpro/habr/upload_files/1d3/a61/c9d/1d3a61c9df0a189afde98cd36f0cbc74.png)
В этой статье я покажу простой способ генерации видео программами на Python и C/C++ без использования стороннего API. Вам так же потребуется ffmpeg, без него вы не сможете конвертировать файлы в читаемые форматы!
Проверка фреймворка Ogre3D статическим анализатором PVS-Studio
![](https://webcf.waybackmachine.org/web/20220403214021im_/https://habrastorage.org/getpro/habr/upload_files/4d0/af0/c2d/4d0af0c2d7d01c057764af3542209b1f.png)
Обычные пользователи любят графические движки, потому что с ними удобно работать. Команда PVS-Studio любит графические движки, потому что там часто попадаются интересные фрагменты кода. По просьбе одного из читателей нашего блога в этой статье будут рассмотрены результаты анализа графического фреймворка Ogre3D. Каждому по интересному срабатыванию из проекта, и пусть никто не уйдёт обиженным!
Самодельный измеритель крена и дифферента корабля
![](https://webcf.waybackmachine.org/web/20220403214021im_/https://habrastorage.org/webt/hh/xs/6q/hhxs6q6vfmmhce3v4tebvf3hfha.jpeg)
Одним из приборов, необходимых на различных судах, является кренометр-дифферентометр. Нужен он для того, чтобы знать, как именно качается судно, и не пора ли что-то предпринять для уменьшения этой качки (ну или сделать вовремя ноги с корабля, уподобившись корабельной крысе). Разработка таких устройств довольно редкая задача, но я с ней всё-таки столкнулся, и решил попробовать сделать свою реализацию прототипа такого кренодифферентометра. Под катом я предложу вам вариант изготовления такого электронного кренометра-дифферентометра, как я сейчас вижу его возможную реализацию.
Шаблоны C++: как итерировать по std::tuple — основы
![](https://webcf.waybackmachine.org/web/20220403214021im_/https://habrastorage.org/getpro/habr/upload_files/c36/946/e99/c36946e9990c05eb6071a8ff528bd12e.png)
Для большинства стандартных контейнеров перебор элементов можно осуществлять просто с помощью цикла for с диапазоном прямо во время выполнения. Но что насчет кортежей (std::tuple)? В этом случае мы не можем использовать обычный цикл, так как он не «понимает» список аргументов кортежа во время компиляции. В этой статье я покажу вам несколько приемов, которые вы можете использовать для итерации по элементам кортежа.
Как написать рефлексию для C++
![](https://webcf.waybackmachine.org/web/20220403214021im_/https://habrastorage.org/getpro/habr/upload_files/593/a6c/bed/593a6cbed0db59ec5e3e9e70a4717703.jpeg)
C++ поистине противоречивый язык. Старый добрый С существует аж с 1972 года, С++ появился в 1985 и сохранил с ним обратную совместимость. За это время его хоронили ни раз и ни два, сперва Java, теперь его потихоньку продолжают хоронить Go и Rust. Все его недостатки пережеваны множество раз. Если вы пришли в мир С++ из других ООП языков, то здесь вы не найдете...
Альтернативы исключениям С++ и зачем они нужны
![](https://webcf.waybackmachine.org/web/20220403214021im_/https://habrastorage.org/getpro/habr/upload_files/ad6/85a/662/ad685a6627bd4845264680dbb0eae291.jpg)
Современные тенденции в области аппаратного обеспечения ведут к тому, что использование исключений на C++ всё труднее и труднее оправдать. В представленной работе эта проблема иллюстрируется наглядно, даётся её количественная оценка и обсуждаются потенциальные будущие направления исправления исключений. Материалом делимся к старту курса по разработке на С++.
Способы переписать логические параметры в С++
![](https://webcf.waybackmachine.org/web/20220403214021im_/https://habrastorage.org/getpro/habr/upload_files/e89/008/341/e8900834168a2d7ef2a99dfdf5958cb4.png)
Программисты читают код намного чаще, чем пишут его, поэтому важно писать понятный, последовательный, однозначный код. Автор книги С++17 in detail написал о способах избегать путаницы. Делимся его материалом к старту курса по разработке на С++.
Вклад авторов
-
Andrey2008 6471.9 -
tangro 2409.0 -
SvyatoslavMC 2388.0 -
antoshkka 1512.0 -
haqreu 1366.0 -
olegchir 968.2 -
khizmax 945.4 -
eao197 845.0 -
anastasiak2512 741.0 -
0xd34df00d 726.0