Обновить
256K+

C++ *

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

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

PVS-Studio проверяет OpenMW: во вселенной Morrowind не всё гладко

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

Я проверил проект OpenMW с помощью PVS-Studio и написал эту крошечную статью. Нашлось слишком мало ошибок. Но меня просили написать про проверку этого проекта статью, и вот она.
Читать дальше →

Вызов функции, соответствующей заданной строке

Время на прочтение14 мин
Охват и читатели15K
Привет!
Не знал, как поточнее назвать статью, но хотелось бы разобрать одну маленькую задачку, которая звучит следующим образом:
На вход подаётся отформатированная некоторым образом строка, в которой указаны имя функции, её аргументы и типы аргументов. Нужно иметь возможность вызвать соответствующий обработчик функции, корректно передав все аргументы.

Например, так ActionScript пытается вызвать функцию test с тремя аргументами str, false, 1.0(соответственно типы аргументов: String, Boolean, Number):
<invoke name="test" returntype="xml"><arguments><string>str</string><false/><number>1.0</number></arguments></invoke>

Хотелось бы, чтобы со стороны C++ была вызвана соответствующая функция:
void test_handler(const std::wstring& str, bool flag, double n);


Под катом — реализация с использованием нового стандарта и, для сравнения, реализация с использованием старого стандарта(и капельки boost-а).
Читать дальше →

Tesseract. Распознаем ошибки в системе распознавания

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

Tesseract — свободная компьютерная программа для распознавания текстов, разрабатываемая компанией Google. В описании проекта говорится: «Tesseract is probably the most accurate open source OCR engine available». А давайте попробуем, сможет ли статический анализатор PVS-Studio распознать какие-то ошибки в этом проекте.
Читать дальше →

Lock-free стек для Windows

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

Windows принято не любить. Однако, зачастую, фраза: «Книгу писателя не читал, но осуждаю» очень хорошо описывает эту ситуацию. Несмотря на укоренившееся презрение к «Винде», отдельные вещи в ней реализованы весьма удачно, и именно об одной из них мы хотели бы написать. Отдельные фрагменты WinAPI, хотя и были реализованы достаточно давно, по разным причинам, и часто незаслуженно, выпали из поля зрения широкой аудитории.
В этой статье речь пойдёт о встроенной в ОС реализации lock-free стека и сравнении его производительности с кросс-платформенными аналогами.
Читать далее

GalaPlugin — JS/QML плагин для QtCreator

Время на прочтение5 мин
Охват и читатели4.9K
После прочтения поста Использование панели режимов QtCreator + 2 плагина, у меня возникла идея попробовать создать плагин, способный расширять функциональность QtCreator'а с помощью JavaScript и QML. Появился проект GalaPlugin.

Вот небольшая демка того, что получилось.

Подробнее

Новые возможности лямбд в C++14

Время на прочтение4 мин
Охват и читатели36K
Всем известно, что функциональное программирование распространяется с быстротой огня по современным языкам программирования. Недавние примеры — Java 8 и C++, оба из которых теперь поддерживают лямбда-функции.

Итак, начнём (и да прибудет с нами веселье). Этот текст также доступен в виде слайдов на Slideshare. На написание этой статьи автор был вдохновлён создателем JSON Дугласом Крокфордом.

Функция Identity, которая принимает аргумент и возвращает тот же самый аргумент:

auto Identity = [](auto x) {
  return x;
};
Identity(3); // 3

Примечание переводчика: Новой по сравнению с C++11 является возможность не указывать названия типов.
Более интересные примеры

Анализатор PVS-Studio проверяет TortoiseGit

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

В большинстве наших статей говорится об ошибках, найденных в различных проектах с помощью анализатора PVS-Studio. В этот раз для целью для проверки стал проект TortoiseGit.
Читать дальше →

Разработка мобильных приложений в Embarcadero FireMonkey (FMX 6)

Время на прочтение8 мин
Охват и читатели39K
Никому не нравится писать один и тот же код несколько раз, но именно это и приходится делать, если мобильное приложение должно быть реализовано для нескольких платформ сразу. Досадно, что программистам компании, в каждом случае, требуются применять различные инструменты, навыки и подходы. Разумеется, возникает желание, чтобы, перенося приложение, как минимум, не приходилось менять язык программирования.

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

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

Cross-compile POCO из Windows для Linux

Время на прочтение5 мин
Охват и читатели8.7K
POCO — легковесный, мультиплатформенный open-source набор библиотек и классов С++, облегчающих написание мультиплатформенного ПО.
Выпускается под Boost Software License.
Дополнительные сведения о POCO:
pocoproject.org/features.html
ru.wikipedia.org/wiki/POCO
Прекрасно организованная документация по структуре классов доступна в html-онлайн, html-оффлайн.
Документация по основным возможностям с примерами использования — в pdf: pocoproject.org/documentation/index.html

POCO имеет богатейший функционал — очень многое — всё-всё, что нужно для счастливой жизни C++ программиста! Работает инструментарий отлично, имеет продуманный API.

POCO собирается для большого числа ОС, в т.ч. Desktop Windows, Windows CE, Linux.

По своему опыту замечу, что POCO для этих ОС собирается без проблем.
Методику кроссплатформенной сборки из Windows для этих ОС постараюсь вам, уважаемые с++ разработчики, донести в своих трёх статьях «Cross-compile POCO из Windows».

Статья «Cross-compile POCO из Windows для WinCE» habrahabr.ru/post/223157
Читать дальше →

Внедрение зависимостей в C++

Время на прочтение7 мин
Охват и читатели34K
MagicClass::getInstance().getFooFactory().createFoo().killMePlease();

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

Постановка

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

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

Упрощенный доступ к объектам. Информация, какой объект откуда можно получить чаще всего совершенно неинтересна. Более того, она отвлекает от базовой функциональности и способствует более сильному связыванию подсистем проекта, чем того хочется. Также нежелание программиста продумывать адекватные точки доступа к добавляемым сервисам может негативно сказаться на общей архитектуре системы. «В последние дни я получал почти все нужные мне объекты из модуля номер N, закину и эти туда же...».

Рабочий вариант с тестовым примером можно взять отсюда.
Читать дальше →

Асинхронные задачи в С++11

Время на прочтение5 мин
Охват и читатели35K
Доброго времени суток, хотел бы поделиться с сообществом своей небольшой библиотектой.
Я программирую на С/C++, и, к сожалению, в рабочих проектах не могу использовать стандарт C++11. Но вот пришли майские праздники, появилось свободное время и я решил поэкспериментировать и по-изучать этот запретный плод. Самое лучшее для изучения чего либо — это практика. Чтение статей о языке программирования научит максимум лучше читать, поэтому я решил написать маленькую библиотеку для асинхронного выполнения функций.
Сразу оговорюсь, что я знаю, что существует std::future, std::async и тп. Мне было интересно реализовать самому нечто подобное и окунуться в мир лямбда-функций, потоков и мьютексов с головой. Праздники — отличное время для велопрогулок.
Читать дальше →

Сайт на с++ (CppCMS). Часть 1

Время на прочтение24 мин
Охват и читатели49K
Здравствуй уважаемый %username%.
Сегодня я хотел бы поделиться с тобой личным опытом в создании Web сайта на CppCMS (библиотека-шаблонизатор на с++). Можно назвать это «помощью начинающему программисту на CppCMS».

Зачем писать сайт на с++


Доводы за и против такого решения могут быть весьма разнообразны и, что бы не спровоцировать войну «языковых школ», я проведу аналогию с автомобилями: «Я купил этот. Нравится. Езжу. Продавать не хочу!».
Из дополнительных аргументов будет то, что данный язык является профильным для моего рабочего места.
Читать дальше →

Транзакционная память: история и развитие

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

Определение


Параллельное программирование сложно. При использовании систем с общей памятью не обойтись без синхронизации доступа параллельных процессов/потоков к общему ресурсу (памяти). Для этого используются:
  • блокировки (mutex);
  • алгоритмы без блокировки (lockless, lock-free);
  • транзакционная память.


Транзакционная память — технология синхронизации конкурентных потоков. Она упрощает параллельное программирование, выделяя группы инструкций в атомарные транзакции. Конкурентные потоки работают параллельно1, пока не начинают модифицировать один и тот же участок памяти. К примеру, операции добавления узлов в красно-чёрное дерево (анимация в заголовке) способны работать параллельно в нескольких потоках.
Скрытый текст
/* Move item from one list to another */
int move(list *from, list *to) {
    __transaction_atomic {
        node *n = pop(from);
        push(to, n);
    }
}

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

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

Почему я люблю Qt и вы все тоже должны его любить

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

После суток жизни поста я начал замечать утечку кармы, так что заранее прошу прощение за возможно недопустимый стиль изложения в статье и субъективизм

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

Последнее время я не мог не обратить внимание на популярность темы Qt на хабрике, но тем не менее, в комментах продолжают встречаться люди, которые говорят откровенно лживые и непонятные вещи. Этим постом я хотел развеять малость заблуждений о Qt и рассказать, почему же ты должен пересесть со своих Java/Obj-C/.NET на мягкий и пушистый Qt.

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

Ну, что, поехали?
Поехали!

Пишем плагин для GStreamer на MS Visual Studio

Время на прочтение9 мин
Охват и читатели17K
Меня всегда интересовали прикладные задачи обработки видеоданных в реальном времени. На Хабре я прочитал серию статей о мультимедиа фреймвоке GStreamer:

Очень захотелось что-нибудь сделать с его использованием. Но, как обычно бывает, текущие задачи полностью исчерпывали ресурс свободного времени.
Читать дальше →

Компиляция исходников (cpp, cs) компилятором Visual Studio без запуска IDE в Windows

Время на прочтение16 мин
Охват и читатели42K
Частенько нет необходимости запускать тяжеловесную IDE Visual Studio для компиляции небольших приложений, проведения каких-либо тестов кода, не требующего полномасштабной отладки. В подобных случаях можно оперативно собрать приложение в консольном режиме, используя возможности предоставляемые компилятором от Microsoft (cl.exe) и запускными модулями IDE (devenv.exe, msdev.exe). Далее приводится код файлов сценариев (cmd) интерпретатора командной строки Windows, который с небольшими изменениями каждый может настроить под себя, с учётом путей к Visual Studio в своей системе.
Подробности

Почему нам необходима рефлексия в C++1y

Время на прочтение4 мин
Охват и читатели17K
Программам необходимы данные. Программы выдают лишь настолько хороший результат работы, насколько полны и валидны были входные данные. Для некоторых программ входными данными являются обычные файлы или полученная из сети информация (пример — ваш браузер). Другие программы оперируют исходными кодами. Эти вторые «мета-программы» тоже нуждаются в данных. Чем они будут качественнее — тем качественнее будет и результат.

Что же за данные мы «скармливаем» таким программам? Ну, в С++ более важным чем «что?» является вопрос «когда?» (помните Морфеуса?). Программа на С++ это всего-лишь последовательность битов, которые компилятор пытается прочитать и понять. И вот в процессе этого «понимания» компилятор преобразует код на С++ в машинные инструкции и (что особенно интересно!) выполняет некоторую часть кода вашей программы. Да, мы говорим о мета-программировании на этапе компиляции.

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

Компилятор языка С++ уже имеет всю эту информацию! Но, к сожалению, не в доступной для мета-программирования форме. Получается странная такая ситуация — мы можем выполнить кое-какой код на этапе компиляции — но вот большинства данных у нас нет. Ну и здесь было бы логично задаться вопросом «А как же мы можем эти данные получить?».
Читать дальше →

«Правило ноля»

Время на прочтение5 мин
Охват и читатели48K
Применительно к с++03 существует “правило трех”, с появлением с++11 оно трансформировалось в “правило 5ти”. И хотя эти правила по сути являются не более чем неформальными рекомендациями к проектированию собственных типов данных, но тем не менее часто бывают полезны. “Правило ноля” продолжает ряд этих рекомендаций. В этом посте я напомню о чем, собственно, первые 2 правила, а также попробую объяснить идею, стоящую за “правилом ноля”.
Читать дальше →

C++ User Group, встреча в Нижнем Новгороде

Время на прочтение2 мин
Охват и читатели4.4K
Всем привет.

В прошлую субботу — 19 апреля прошла очередная встреча C++ User Group. На этот раз мы встречались в Нижнем Новгороде.
На встречу пришло 82 человека, причём участники были не только из Нижнего Новгорода: Санкт-Петербург, Москва, Рязань, Саратов, Чебоксары, Екатеринбург, Великий Новгород. Меня немного пугает, что зарегистрировался, но не приехал участник из Иркутска. Надеюсь, с ним всё хорошо.
Читать дальше →

Проверка открытого проекта WinSCP, разрабатываемого в Embarcadero C++ Builder

Время на прочтение4 мин
Охват и читатели16K
PVS-Studio and WinSP
Мы постоянно проверяем открытые проекты на языке Си/Си++. Но почти всегда, это проекты, разрабатываемые в Visual Studio. А вот Embarcadero C++ Builder мы как-то обделили вниманием. Нужно исправляться и сегодня мы проверили проект WinSCP.
Читать дальше →