Все потоки
Поиск
Написать публикацию
Обновить
193.68

C++ *

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

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

Вычисление максимального числа в массиве на этапе компиляции

Время на прочтение3 мин
Количество просмотров8K
Здравствуй хабр!

Не так давно понадобилось вычислить максимальную длину из нескольких заданных строк на этапе компиляции. Нужно выделить память под массив char[], так чтобы в нем уместилась любая строка из заданных. Логично предположить, что если система спроектирована хорошо, никаких вычислений на этапе компиляции не нужно, можно воспользоваться динамическим выделением используя std::auto_ptr или std::string, но это не тот случай. Структура в которой хранится буфер char[] должна быть POD-типом.

По сути задача сводится к определению максимального числа в массиве на этапе компиляции. В данном топике я покажу как это сделать в стандарте c++03 и c++11. В ходе поиска решений нашел две статьи, которые помогли мне решить проблему: habrahabr.ru/post/166201, habrahabr.ru/post/38622.
Узнать как...

Аргументированная фабрика

Время на прочтение6 мин
Количество просмотров6.3K
Доброго времени суток!

Задача

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

Лямбда-функции и реализация удобного механизма Callback-ов на C++

Время на прочтение5 мин
Количество просмотров51K
В этой статье на примере реализации механизма обратного вызова будет рассмотрена возможности применения лямбда функций в удобной и быстрой форме.
Читать дальше →

Qt Graphics View Framework — темная сторона. Часть 2

Время на прочтение5 мин
Количество просмотров14K
Начав свой путь, мы не останавливаемся и продолжаем изучать темные стороны документации. Где-то они могут быть характерны для всего Qt, а где-то присущи только Graphics View. Но так или иначе встреча с ними не всегда проходит безболезненно.
Читать дальше →

Сохранение изображения с помощью libpng

Время на прочтение3 мин
Количество просмотров27K

Развлекаясь на досуге с OpenGL, решил научиться делать скриншоты средствами программы, а не системы. Довольно быстро нагуглил функцию glReadPixels, но вот с сохранением картинки вышла проблема. Вспомнил былые времена, когда полностью своим кодом сохранял в bmp, нашел функцию сохранения в tga, понял, что все эти варианты попахивают велосипедизмом и решил использовать широко распространенную библиотеку. Выбор пал на libpng.
Дальше пошли грабли.

Оказалось, что никакого описания библиотеки на русском языке нет (собственно поэтому и пишу сейчас этот пост), а английская документация написана не самым удобным образом и не содержит даже простейшего полноценного примера использования.
Ниже я постараюсь объяснить, как средствами libpng сохранить изображение в простейшем случае.
Читать дальше →

Миграция данных с MySQL на PostgreSQL

Время на прочтение11 мин
Количество просмотров21K
По мере работы с базами данных, ознакомления с их плюсами и минусами, возникает момент, когда принимается решение миграции с одной СУБД в другую. В данном случае возникла задача переноса сервисов с MySQL на PostgreSQL. Вот небольшой перечень вкусностей, которые ждут от перехода на PostgreSQL, версии 9.2 (с более подробным списком возможностей можно ознакомится тут):
  • наследование таблиц (есть ограничения, которые обещают в будущем исправить)
  • диапазоны: int4range, numrange, daterange
  • поддержка из коробки несколько языков для хранимых функций (PL/pgSQL, PL/Tcl, PL/Perl, PL/Python и голый C)
  • оператор WITH, позволяющий делать рекурсивные запросы
  • (планируется) материализованные представления (частично они доступны и сейчас — как IUD правила к представлению)
  • (планируется) триггера на DDL операции

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

Знакомство с libuniset — библиотекой для создания АСУ

Время на прочтение7 мин
Количество просмотров11K
В данной статье речь пойдёт об открытой библиотеке для построения распределённых систем управления — libuniset, написанной на языке C++ под ОС Linux. Будет дан общий обзор основных понятий, элементов и концепций, используемых в библиотеке.

Основной целью библиотеки libuniset является предоставление готовых «кубиков» для построения распределённых автоматизированных систем управления (АСУ). В любой АСУ можно выделить такие основные направления как:
  • ввод/вывод;
  • сетевой обмен;
  • процессы управления (алгоритмы);
  • хранение данных;
  • работа с БД.

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

Типичным проектом с использованием данной библиотеки является проект,
Читать дальше →

Дружим Python 3 с MS Visual C++. Строим мост в Boost.Python с автоматической перекодировкой

Время на прочтение9 мин
Количество просмотров14K
Всем доброго {daytime}!

Сегодня пришла пора рассказать вам о фундаментальной проблеме перекодировки при взаимодействии проекта собранного на MS Visual C++ на платформе Windows и наиболее приятной скриптовой обвязки для языка C++, благодаря библиотеке Boost.Python, собственно написанной для языка Python.

Вы ведь хотите использовать для вашего приложения на C++ под ОС Windows хорошую скриптовую обвязку на последней версии Python 3.x, либо вы хотите использовать для вашего приложения на Python максимально ускоренный участок кода вашего модуля, переписанный на C++. В обоих случаях, если вы знаете оба языка как минимум хорошо, вам стоит это прочитать.
Читать дальше →

Nested Diagnostic Context, log4cpp и Boost asio

Время на прочтение7 мин
Количество просмотров5.9K
В данной статье я хочу показать, как можно использовать NDC в асинхронных операциях на примере log4cpp и boost.asio

Nested Diagnostic Context (NDC) — контекст, который добавляется в лог. Этот контекст может использоваться для дальнейшей фильтрации лог файла. Особенно это полезно, если производится несколько операций, и эти операции связаны между собой, например: выборка данных из БД, обработка, упаковка в сообщение, передача сообщения по сети клиенту и т.д… Если таких операций много и происходят они параллельно (или асинхронно), то по логу иногда бывает тяжело восстановить последовательность операций. Для этого и используется NDC: вначале мы создаем уникальный(псевдо) идентификатор, и затем помечаем каждую операцию логгирования в нашей цепочке этим идентификатором.

В теории все хорошо: генерируем уникальный ID и передаем его в логгер, однако на практике возникает несколько проблем:
  • Реализация NDC в библиотеке log4cpp основана на механизме Thread Local Storage (Thread Specific Ptr), таким образом NDC хранится только для одного потока. Соответственно встает вопрос передачи NDC между потоками
  • Из первого пункта также вытекает следующая проблема: асинхронные операции, например в boost::asio::io_service. Так как asio позволяет в одном (или нескольких) потоках выполнять множество асинхронных операций, то из-за особенностей log4cpp мы не сможем увидеть в логе правильный NDC. Нужен специальный механизм, который обеспечит корректность NDC в асинхронных операциях asio


решением второй проблемы мы и займемся

Конфигурационные файлы. Библиотека libconfig

Время на прочтение8 мин
Количество просмотров42K

Введение


Как-то находясь в поиске как мне прикрутить конфигурационные ini файлы или json к моему сервачку перебирал варианты, но почему-то они были неудобны или слишком простые, или велосипеды. И хоть я люблю xml конфигурирование, но порою это чрезмерно огромные файлы и неудобно для небольшого количества настроек писать много текста. Раз задал другу вопрос по этой теме, он то мне и подкинул библиотеку. Напоминает она json в смеси с yaml.



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

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

Особенности работы с Multicast

Время на прочтение4 мин
Количество просмотров72K
Хочу поделиться небольшим опытом работы с технологией групповой передачи данных, или иначе UDP Multicast, и проблемой особенностью, которая возникает при написании кроссплатформенного кода.
Читать дальше →

Использование SCM для управления драйверами в C# реализованной с помощью dll на C++/cli

Время на прочтение6 мин
Количество просмотров5.3K

Service Control Manager (SCM)


SCM — это сервер, реализованный в Windows, для удаленного управления сервисами (вызовом процедур).

Для того, чтобы запустить драйвер в Windows, ему в соответствие ставится сервис, который обеспечивает управление этим драйвером. Не путать с устройством, которое создает драйвер в системе, через которое происходит обмен сообщениями с драйвером. Это устройство создается уже после старта драйвера, а вот SCM обеспечивает само внесение драйвера в систему. С помощью SCM можно: добавлять, удалять, запускать или останавливать службы.

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


Написать буферный класс позволяющий упростить работу SCM в C#.
Сам внешний вид этого класса можно обознать очень просто:

public ref class ServiceControlManager : public IDisposable
{
public:
	ServiceControlManager(void);
	void AddDriver(String^ ServiceName, String^ BinaryPathName);
	void DeleteDriver(String^ ServiceName);
	void StartDriver(String^ ServiceName);
	void StopDriver(String^ ServiceName);
protected:
	~ServiceControlManager();
	!ServiceControlManager();
private:
	SC_HANDLE SCMHandle;
};

Конструктор, деструктор, финализатор, основные методы, из атрибутов только HANDLE объекта SCM. Из этого следует, что экземпляр объекта этого класса будет содержать в себе созданный объект SCM, а методы упрощают с ним работу. Класс является буферным, и поскольку он реализован в C++/cli он будет автоматически масштабируем для работы в среде .NET, соответственно и в C#.
Читать дальше →

Библиотека логирования log4cplus

Время на прочтение2 мин
Количество просмотров12K
Недавно на Хабре промелькнула пара статей о библиотеках логирования для С++. Статьи хорошие и доходчивые, автору респект. Но лично я не понимаю следующих вещей:
  • Как можно пользоваться библиотекой, разработка которой заброшена много лет назад (log4cxx)?
  • Зачем библиотеке логирования зависимости от других библиотек (log4cxx, Pantheios) ?
  • Как можно не иметь такого базового функционала, как Rolling Files? (Pantheios)
  • Зачем библиотеке логирования такие размеры (log4cxx — в сумме 4.1 Мб в архиве, Pantheios — 9.3 Мб в архиве )?
  • Почему при компиляции библиотеки логирования я должен разгребать ~300 ошибок (log4cxx) ?
Поэтому я решил рассказать о такой библиотеке, как log4cplus, у которой:
  • Последний стабильный релиз вышел в 2011 году, имеется активный трекер и постоянные коммиты в репозиторий
  • Имеется куча механизмов вывода логов (одних только Rolling Files — 2 вида)
  • Никаких внешних зависимостей
  • Общий размер исходников в архиве — 420 Кб (это с документацией, тестами и примерами)
  • В комплекте готовые проекты под разные платформы, которые компилируются без ошибок
  • Прикручивается к проекту менее, чем за 5 минут
Читать дальше →

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

как вы относитесь к гипертрофированному СИ?

Время на прочтение1 мин
Количество просмотров927
const int AllocAccountType_ACCOUNT_IS_CARRIED_ON_NON_CUSTOMER_SIDE_OF_BOOKS_AND_IS_CROSS_MARGINED = 6;
const char ClearingFeeIndicator_FULL_AND_ASSOCIATE_MEMBER_TRADING_FOR_OWN_ACCOUNT_AND_AS_FLOOR_BROKER[] = "F";


и так 2634 строки заголовочного файла с одними константами.

вот такое API приходится ковырять иногда. Есть еще примеры позлее?

P.s
Опубликовано по просьбе JohnWest

Использование Direct2D и DirectWrite в .Net-среде

Время на прочтение7 мин
Количество просмотров10K
Несмотря что «нагуглить» в интернете можно все, для новых технологий это далеко не так. В частности, когда я захотел использовать достаточно новые технологии Direct2D (не бойтесь, это никак не связано с DirectX 7) и DirectWrite в своем .Net-приложении, то столкнулся с проблемой что примеров взаимодействия этих библиотек и .Net нет. Поэтому пришлось самому покопаться.
Upd.: переношу в C++ т.к. дотнетчикам явно не интересно.

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

Статические DAG-графы: почему TBB иногда избыточен и как сделать планировщик с гарантированным временем выполнения

Уровень сложностиСредний
Время на прочтение4 мин
Количество просмотров1.3K

Многие thread-пулы оптимизированы под динамический spawn и бесконечный backlog. В этой статье — подход для противоположного кейса: фиксированный DAG, один run и полный контроль над поведением

Читать далее

Быстрый старт контроллера шаговых двигателей SMSD–4.2CAN в режиме драйвера

Уровень сложностиПростой
Время на прочтение39 мин
Количество просмотров1.5K

Приводятся инструкции, которые помогут сделать первые шаги в экспериментах с контроллером в режиме драйвера шагового двигателя SMSD–4.2CAN под маркой НПО «Электропривод». Это настройка контроллера в режиме драйвера и запуск шагового двигателя с помощью программы CANopen Builder Limited v1.0, запуск двигателя из консоли, программ, написанных на языках С++ и Java, в которых потребуется библиотека CHAI для преобразователя интерфейсов USB–CAN ГКМН.468351.017-03 КБ «Марафон».

Первые две части представляют собой расшифровку лекций прочитанных Белобородовым А.В. и Харьюзовым П.Р. в 2024–2025 годах.

Читать далее

Самый обобщённый живучий алгоритм

Уровень сложностиПростой
Время на прочтение8 мин
Количество просмотров2.7K

Путь от костылей к универсальному живучему алгоритму

В статье разбирается само устройство обобщённого алгоритма: как концептуально закладывать возможность учёта истории наблюдений, реконструкции мира и перебора альтернатив, чтобы ИИ-ассистенты/программисты могли реализовать эти механизмы под свои задачи. Детально разобран только универсальный перебор вариантов; реализация остальных особенностей предоставляется разработчику специализированное версии алгоритма.

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

Пропустить обложку через вентилятор

Fail Case: Реализация полиморфизма без virtual на C++: концепты, трейты и Ref (и почему я отказался от этого подхода)

Уровень сложностиСредний
Время на прочтение6 мин
Количество просмотров5K

Как был переработан подход к полиморфизму в C++‑фреймворке Flox: замена virtual на статически сгенерированные vtable с концептами. В статье описана архитектура, проблемы, решение и метрики прироста производительности.

Читать далее

Тезисы о std::set и std::multiset в C++

Уровень сложностиПростой
Время на прочтение10 мин
Количество просмотров3.5K

Приветствую всех читателей! Меня зовут Максим, и я хочу поделиться с вами своими знаниями о программировании. Я не являюсь профессиональным разработчиком, и программирование для меня — это хобби и способ автоматизации рутинных задач на работе. В этой статье я расскажу вам об ассоциативном контейнере std::set и std::multiset в C++. Надеюсь, что эта информация будет полезной и интересной для всех, кто хочет узнать что-то новое о программировании.

Ну давай, удиви меня

Вклад авторов