Обновить
459.82

C++ *

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

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

Продолжение проверки Geant4

Время на прочтение5 мин
Охват и читатели6.4K
Написал правильную статью про проверку проекта Geant4. Напомню предысторию. Недавно была проверена старая версия библиотеки Geant4 и написана статья "Copy-Paste и мюоны". Почему была проверена старая версия? Люди не совершенны. Суть оплошности можно узнать в предыдущей статье. Теперь же вашему вниманию предлагается краткий отчет о проверке Geant4 версии 10.0-beta.

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

Copy-Paste и мюоны

Время на прочтение14 мин
Охват и читатели9K
PVS-Studio, CERN

Сейчас я буду рассказывать и показывать на примерах, почему физики тоже должны использовать инструменты статического анализа кода. Мне бы хотелось, чтобы этим инструментом был PVS-Studio. Но, конечно, любой другой инструмент тоже будет полезен. Анализатор кода сократит время на отладку приложений и уменьшит головные боли от тупых ошибок. Лучше побольше думать о физике и поменьше об ошибках в программах на языке Си++.

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

Два парадокса в программах на языке C

Время на прочтение3 мин
Охват и читатели31K
Хочу рассказать о двух странностях, с которыми мне пришлось столкнуться, программируя вычислительные алгоритмы на языке C.

Итак, первое неожиданное поведение для некоторых программистов. Вот маленькая прога.

#include <stdio.h>
int main()
{
    unsigned char a = 1, b;
    b = ~a >> 1;
    printf("%u\n", b);
    return 0;
}


Разберем ее. Поразрядная операция ~ инвертирует состояние каждого бита байта a, в который изначально записана единица. В результате должны получить 11111110b, то есть 254. Сдвигая этот байт вправо на один бит, должны получить 127. Однако код, который дает, например, компилятор gcc, выводит в консоль число 255?!

Сначала я подумал о том, что дело в приоритете — вдруг у компилятора приоритет операций «косячит»? То есть будто бы сначала делается сдвиг, а потом — инверсия (а что, логично...). Так в чем же дело?
Читать дальше →

Асинхронность: назад в будущее

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

Асинхронность… Услышав это слово, у программистов начинают блестеть глаза, дыхание становится поверхностным, руки начинают трястись, голос — заикаться, мозг начинает рисовать многочисленные уровни абстракции… У менеджеров округляются глаза, звуки становятся нечленораздельными, руки сжимаются в кулаки, а голос переходит на обертона… Единственное, что их объединяет — это учащенный пульс. Только причины этого различны: программисты рвутся в бой, а менеджеры пытаются заглянуть в хрустальный шар и осознать риски, начинают судорожно придумывать причины увеличения сроков в разы… И уже потом, когда большая часть кода написана, программисты начинают осознавать и познавать всю горечь асинхронности, проводя бесконечные ночи в дебаггере, отчаянно пытаясь понять, что же все-таки происходит…

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

Так что же такое асинхронность? Почему она так привлекательна? А главное: что с ней не так?
Назад в будущее...

ABC-сортировка

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

Данная разновидность поразрядной MSD-сортировки «заточена» для строк. Впрочем, алгоритм так назван отнюдь не за лексическую специализацию. Автор Аллен Бичик (Allen Beechick) выбрал название в честь себя любимого, ABCsort расшифровывается как Allen Beechick Character sort.

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

Что касается алгоритма, то это единственно известная мне сортировка, за использование которой её изобретатель требует деньги.
Богоугодная сортировка за 88 у.е.

Обзор новых возможностей С++14: Часть 2

Время на прочтение5 мин
Охват и читатели68K
На этот раз нововведений гораздо меньше, чем в первой части. Все-таки С++14 считается незначительным релизом, нацеленным скорее на устранение недочетов С++11, чем привнесение новых возможностей.

Краткий перечень:
  • Освобождение памяти определенного размера
  • Одинарная кавычка, как цифровой разделитель
  • Аттрибут [[deprecated]]
  • Пользовательские литералы для std::complex
  • Filesystem API
  • Преобразование сетевого порядка байт

Обзор новых возможностей С++14: Часть 1
Текущий черновик стандарта

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

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

Время на прочтение4 мин
Охват и читатели18K
Всем доброго пятничного вечера!

Сегодня я хочу рассказать о некоторых коварных особенностях статических переменных при неправильной линковке исполняемых модулей. Я покажу проблему из моей реальной практики, которая может возникнуть у каждого.
Разжевываю все довольно детально, поэтому у «бывалых» и красноглазиков может возникнуть ощущение, что я «колупаюсь в песочнице», но это статья не только для них.
Читать дальше →

SDL2: Основы

Время на прочтение8 мин
Охват и читатели80K
К сожалению, даже на официальной вики почти не возможно найти каких либо примеров использования SDL2.x, что уж говорить о рунете. Пытаясь разобраться, я нашел всего лишь пару статей, которые не покрыли и трети моих вопросов.
SDL 2.x существенно отличается от 1.x и даже, если в прошлом вам приходилось с ним работать — теперь вы рискуете ничего не понять.

Сегодня мы напишем простенькую программу выводящую на экран фон и зумируемый спрайт персонажа перемещающегося с помощью WASD и стрелок. + разберемся как в SDL работать с мышкой.
Туториал ТУТ

ReactOS: осенний марафон

Время на прочтение3 мин
Охват и читатели8.4K
Осень — традиционное время оживления в стане разработчиков ReactOS.

В своей группе перед хелоуином мы долго «пугали» участников страшными картинками, и каждый раз из-за проблем в дата-центре по совпадению у нас падал сайт. В действительности же мы таким образом представили новейшую разработку — менеджер управления памятью на C++ под кодовым именем Monstera. На данный момент код компонента находится в отдельной одноименной ветке. Новый менеджер позволит избавиться от 90% процентов имеющихся проблем вида "memory could not be read/write" — главной беды ReactOS.

Напутствие от Алексея Брагина
Initial commit of a small subproject I wanted to do for years. If you like it, please feel free to join me as there is more than enough place for improvement.This commit brings the first very small implemented part (mainly everything related to phase 0 initialization).
A cut from the readme file:
Monstera is a new implementation of a memory manager (along with a cache manager) compatible with the ReactOS kernel at source code level and providing the same binary compatible Native API through a lightweight wrapper.
Monstera is implemented in a subset of C++ programming language. A document
outlining specific restrictions, coding style and other considerations is
available.
Key ideas:
1. Object oriented language for object oriented kernel. When NT was implemented, C++ wasn't that good.
2. Simplicity > optimization. Nowadays we can sacrifice a bit of performance in favor of more robust implementation.
3. Same Native API. Internal implementation and external interfaces are two different things.
4. Don't drift away too much. It's still based on NT architecture, but think of it as if Microsoft Research would decide to reimplement NT in C++ for fun.
Credits:
— ReactOS Portable Systems Group for the code which is used as a base in many places of Monstera.
— Alex Ionescu for his invaluable contribution to the ReactOS kernel.
— Timo Kreuzer, Johannes Anderwald for their C++-in-the-kernel-mode help.
— Amine Khaldi for help with the build environment.
— ReactOS team for their great work.

Дальше больше

Эффективная реализация Readers–writer lock на основе «Interlocked Variable Access»

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

Вступление


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

В ходе данной публикации я хочу поделиться идеей реализации хорошо известного примитива синхронизации readers-writer lock на основе, так называемых атомарных операций. Как известно, readers-writer lock призван решать проблему синхронизации доступа к разделяемому ресурсу таким образом, чтобы избегать одновременных чтения и записи, но, при этом позволять параллельное чтение сколь угодно большому количеству потоков.
Читать дальше →

Lock-free структуры данных. Основы: Модель памяти

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

В предыдущей статье мы заглянули внутрь процессора, пусть и гипотетического. Мы выяснили, что для корректного выполнения параллельного кода процессору необходимо подсказывать, до каких пределов ему разрешено проводить свои внутренние оптимизации чтения/записи. Эти подсказки – барьеры памяти. Барьеры памяти позволяют в той или иной мере упорядочить обращения к памяти (точнее, кэшу, — процессор взаимодействует с внешним миром только через кэш). “Тяжесть” такого упорядочения может быть разной, — каждая архитектура может предоставлять целый набор барьеров “на выбор”. Используя те или иные барьеры памяти, мы можем построить разные модели памяти — набор гарантий, которые будут выполняться для наших программ.

В этой статье мы рассмотрим модель памяти C++11.
Читать дальше →

Цикл уроков по SDL 2.0: урок 2

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

От переводчика: продолжение серии туториалов Twinklebear, в оригинале доступных тут. Предыдущий урок можно найти здесь.

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

Как собрать Qt 5.1.1 при помощи Visual Studio 2012 под XP

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

В этой статье нет ничего сверхъестественного. Я хотел просто собрать вместе все нюансы и проблемы, с которыми я столкнулся, связанные с построением Qt в одной статье — вдруг кому-нибудь пригодится.
Читать дальше →

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

Перевод SDL Game Framework Series. Часть 6 — SDL Entities

Время на прочтение5 мин
Охват и читатели12K
В этом уроке, как и обещал, я расскажу вам про такое понятие как «Сущности» (Entities). «Сущности» для всех игровых процессов это своего рода такие игровые объекты, которые могут взаимодействовать в какой-либо форме или каким-то способом друг с другом и с игровым миром. Примерами «Сущностей» могут служить монстры, которых вы встретите на своем нелегком пути, сундуки с сокровищами, которые вы можете открыть, монеты, которые можно собрать, стены, об которые можно убиться и т.д. Таким образом любой объект игрового мира который хоть как-то двигается, проявляет интерактивность, может быть представлен в виде этих «Сущностей».
А поподробнее?

Перевод SDL Game Framework Series. Часть 5 — SDL Animation

Время на прочтение5 мин
Охват и читатели13K
Всем привет! Прошло довольно много времени с момента перевода 4 части серии руководств по разработке игрового фрэймворка с помощью широко известной библиотеки SDL. Теперь мой график немного разгрузился и я готов продолжить (не последнее дело в этом сыграл Андрей Фирсов aka Vorobeez, который буквально выдернул меня из делового потока своими вопросами «А когда же продолжение?!»). К тому же недавно меня перевели в read-only, а так хочется восстановить возможность комментирования постов…
Итак, прошу под кат

RMI средствами С++ и boost.preprocessor

Время на прочтение11 мин
Охват и читатели7.5K
Это моя первая публикация на сем ресурсе, посему, прошу отнестись с пониманием к допущенным мною ошибкам.

RMI — весьма банальная задача для ЯП, поддерживающих интроспекцию. Но, С++, к сожалению, к ним не относится.

В данной публикации я хочу продемонстрировать возможность реализации весьма юзабильной RMI средствами С++ препроцессора.

Постановка задачи


1. Предоставить максимально простой синтаксис, чтоб невозможно было допустить ошибку.
2. Идентификация(связывание) процедур должна быть скрыта от пользователя для того, чтоб невозможно было допустить ошибку.
3. Синтаксис не должен накладывать ограничения на используемые С++ типы.
4. Должна присутствовать возможность версионности процедур, но, так, чтоб не ломалась совместимость с уже работающими клиентами.
Читать дальше →

Создаем платформер за 30 минут

Время на прочтение15 мин
Охват и читатели174K
Здравствуйте! Сегодня мы будем писать платформер, используя C++, Box2D и SFML, а также редактор 2D карт для игр Tiled Map Editor.

image

Вот результат (карта создавалась 5 минут + во время сьемки игра тормозила + экран не так растянут — дефект Bandicam):



Исходники и exe — внизу статьи.
Читать дальше →

DSL на JavaScript для C++ или кодгенератор — это просто!

Время на прочтение8 мин
Охват и читатели8.5K
С добрым понедельником, хабровчане!

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

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

Алгоритм Ахо-Корасик

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

Вступление


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

Начальное описание


Алгоритм Ахо-Корасик реализует эффективный поиск всех вхождений всех строк-образцов в заданную строку. Был разработан в 1975 году Альфредом Ахо и Маргарет Корасик.
Опишем формально условие задачи. На вход поступают несколько строк pattern[i] и строка s. Наша задача — найти все возможные вхождения строк pattern[i] в s.

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

Что быстрее while (true) или for (;;)?

Время на прочтение3 мин
Охват и читатели124K
В сырцах разных авторов видел я разные варианты вечного цикла. Чаще всего мне встречались следующие:
while (true) {
...
}

и
for (;;) {
...
}

Поскольку каждый защищал “свой вечный цикл” как родного, я решил разобраться. Кто же пишет более оптимальный код.
Читать дальше →