Как стать автором
Поиск
Написать публикацию
Обновить
98.56

C++ *

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

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

Динамические библиотеки в Qt

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

Введение


До начала работы с библиотекой Qt я программировал различные задачки на С++ в университете, а на работе использовал Delphi. И конечно же, в процессе работы создавались различные библиотеки. Создавались, можно сказать, с трудом. Не хватало в повседневной жизни тех плюсов, которые давало ООП. Всегда хотелось экспортировать из библиотек целые классы, причем делать это просто, быстро и беззаботно. При этом вопросы о создании библиотек на С++ и дальнейшем их использовании в проектах на Delphi или C возникали очень редко.
Читать дальше →

Затачиваем старый код под новые реалии

Время на прочтение18 мин
Количество просмотров3.3K
Sharp envelope knifeВ данной статье я расскажу об одном из способов, позволяющих с наименьшими усилиями трансформировать программный код на C/C++ в код, написанный на C#. Впрочем, рассказанные принципы подойдут и для других пар языков. Хочу сразу оговориться, что способ не рассчитан на трансформацию кода, реализующего GUI.

Для чего это делать? К примеру, я таким образом портировал известную графическую библиотеку LibTiff (и LibJpeg заодно) на C#. Это позволило использовать наработки многих людей, создававших LibTiff, в моей программе вместе с библиотекой классов .NET Framework. Примеры кода в статье будут в основном из LibTiff и LibJpeg.

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

Variadic templates в C++0x

Время на прочтение20 мин
Количество просмотров74K
Те, кто читал книгу Андрея Александреску «Современное программирование на C++» знают, что существует обширный класс задач (в области метапрограммирования с использованием шаблонов), когда шаблону при инстанцировании необходимо указать переменное (заранее неизвестное) количество аргументов. Типичные примеры таких задач:
— Описание кортежей (tuples)
— Описание типов наподобие вариантов (variants)
— Описание функторов (в этом случае перечень типов аргументов зависит от сигнатуры функции)
— Классификация типов по заранее заданным множествам
— и т. п.

В каждой такой задаче точное количество типов, передаваемых соответствующему шаблону в качестве аргументов, заранее определить сложно. И, вообще говоря, зависит от желания и потребностей того, кто намеревается использовать соответствующий шаблонный класс.
В рамках действующего стандарта С++ сколь-нибудь удобного решения таких задач не существует. Шаблоны могут принимать строго определённое количество параметров и никак иначе. А. Александреску (в упомянутой выше книге) предлагает общее решение, основанное на т. н. «списках типов», в котором типы представлены в виде односвязного списка, реализованного посредством рекурсивных шаблонов. Альтернативным решением (используемом, например, в boost::variant и boost::tuple) является объявление шаблонного класса с большим количеством параметров, которым (всем, кроме первого) присвоено некоторое значение по умолчанию. Оба этих решения являются половинчатыми и не охватывают весь спектр возможных задач. По этому, для устранения недостатков существующих решений и упрощения кода новый стандарт предлагает С++-разработчикам новый вариант объявления шаблонов? «шаблоны с переменным количеством параметров» или, в оригинале, «variadic templates».

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

Использование boost::variant для описания состояний модели

Время на прочтение3 мин
Количество просмотров11K
В моделях данных очень часто требуется хранить некоторые переключаемые состояния. Классический способ в С++ для этого — использование перечислимых типов enum.

Например, если у вас в программе пользователь может переключаться между двумя экранами, вы заводите enum screen { screen_one, screen_two }; и переменную screen cur_screen_. Отрисовщик должен получить у модели «текущий выбранный экран», и затем отрисовать его, запрашивая у модели дополнительные данные, относящиеся именно к этому экрану. Что-то вроде:

switch (model.cur_screen())
{
case screen_one:
  model.get_screen_one_elements();
  ...
case screen_two:
  model.get_screen_two_elements();
  ...
}


При использовании такой модели, программист может запрашивать данные, которые для текущего состояния совершенно не актуальны. Например, вызвать метод get_screen_two_elements() для получения списка элементов второго экрана, когда текущий экран — первый. Хорошей практикой является использование ассертов вида ASSERT(cur_screen_ == screen_one) в методах, зависимых от конкретного экрана. Это обеспечивает некоторый контроль времени выполнения.

Но есть способ обеспечить контроль времени компиляции и более явное разделение состояний с помощью boost::variant.

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

Обратные вызовы и исключения С++

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

Введение


Как известно, многие С-библиотеки используют обратные вызовы для обеспечения какого-либо функционала. Так поступает, например, библиотека expat для реализации SAX модели. Обратный вызов или callback используется для возможности выполнить пользовательский код на стороне библиотеки. Пока такой код не несет побочных эффектов — все нормально, но как только на арене появляется С++, все, как всегда, становится нетривиальным.

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

Правило чтения по спирали

Время на прочтение6 мин
Количество просмотров15K
Техника, известная как «Чтение по спирали/по часовой стрелке» (“Clockwise/Spiral Rule”) позволяет любому программисту разобрать любое объявление языка Си.

Следуйте этим простым шагам:
Читать дальше →

Проблема глобального переопределения new/delete в C++/CLI

Время на прочтение4 мин
Количество просмотров6.5K
Как известно, C++ позволяет глобально переопределять операторы new и delete. Обычно такое переопределение используется для диагностики, поиска утечек памяти и более эффективного распределения памяти.

Все это мы используем в нашем крупном проекте. Однако у нас есть часть, написанная на C#, которая с помощью C++/CLI взаимодействует с основной частью на C++. И вот тут появились проблемы. У нас получались утечки памяти там, где их быть ну никак не могло.
Читать дальше →

Обход дерева без рекурсии и без стека

Время на прочтение3 мин
Количество просмотров28K
Придумал простой итератор для обхода произвольного дерева:
(для облегчения кода прежде всего)

struct Document
{
    Concept *root;
    struct Iter
    {
        Concept *start;
        Concept *cur;
        Concept *bottom;
    }iter;
 
    Concept* Begin(Concept *c)
    {
        iter.start = c;
        iter.cur = c;
        iter.bottom =  0;
        return Next();
    }
    Concept * Next()
    {
Читать дальше →

О неявных объявлениях, обратной совместимости и ABI

Время на прочтение2 мин
Количество просмотров2.3K
Исходные данные: язык С, gcc4.4, x86, GNU/Linux

struct.h:
struct S
{
    int *a;
    int *b;
};

a.c:
#include <stdio.h>
#include "struct.h"

struct S f(struct S v)
{
    printf("v.a = %d, v.b = %d\n", *v.a, *v.b);
    return v;
}

b.c:
#include <stdio.h>
#include "struct.h"

int main()
{
    int a = 1, b = 2;
    struct S v = {&a, &b};
    f(v);
    printf("a = %d, b = %d\n", a, b);
    return 0;
}

makefile:
all: test
        ./test

test: a.c b.c struct.h
        gcc a.c b.c -g -o test


Вопрос: что будет напечатано во время выполнения? Подумайте хотя бы минуту. А лучше возьмите отладчик и походите по этой нехитрой программе.
Читать дальше →

Выход новой версии Code::Blocks IDE 10.5

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

Пару дней назад вышла новая версия (после 2 лет разработки) достаточно популярной открытой IDE, написанной на С++ и wxWidgets — Code::Blocks. Основной язык разработки — C++. Существует система плагинов для расширения возможностей среды.
Читать дальше →

speedtest.net via C++

Время на прочтение10 мин
Количество просмотров6.9K
Весь нижеприведенный код — выдержка из одного моего недавнего проекта, в рамках которого было необходимо определять скорость download и upload. Изобретать велосипед было неохота, посему возникло желание воспользоваться сервисом www.speedtest.net, как наиболее уважаемым и работоспособным из сервисов такого типа. Впрочем, как показала практика, он оказался вполне недружелюбным и некий велосипед таки пришлось изобрести.

Итак, добро пожаловать под кат.

Поиск и редактирование значений в памяти сторонней программы на C++

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

Чем не устраивает ArtMoney



Часто возникает необходимость найти и поменять какие-либо строки/числа в чужой программе. С этой задачей лучше всего справляется ArtMoney. Для тех, кто не умеет или не хочет использовать отладчики, это на сегодня, наверное, единственный вариант, так как нормальных аналогов просто нету. Хотя ArtMoney и поддерживает очень много возможностей для работы с памятью, весь процесс происходит вручную, без возможности создания действий по алгоритму. Если значений много и их надо, например, менять при каждом запуске программы, то время, затрачиваемое на эту работу, превышает всякие допустимые пределы. Выход один — написать свой редактор памяти!
Читать дальше →

PocoCapsule: делаем «Hello world» проще

Время на прочтение7 мин
Количество просмотров2.5K
image Статья рассказывает об опыте знакомства с IoC-контейнером PocoCapsule (C++), возникших трудностях и способах их преодоления. Помимо прочего статья включает небольшой пример для быстрого старта с PocoCapsule (упрощенный проект «Hello World» с официального сайта).

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

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

Несколько слов о размере структур в С/С++ и о том, почему так получилось

Время на прочтение3 мин
Количество просмотров35K
Ниже по тексту термином «платформа» будем называть любой заданный набор из процессора, компилятора и операционной системы, под которой скомпилированный код будет запускаться.

Исторически язык C создавался таким, что среди главных целей, положенных в его основу есть такие:
  • быть максимально независимым от какой-то конкретной платформы,
  • быть максимально эффективным на всех платформах. В идеале — на всех.

Немножко о разнообразии платформ. Их (платформ) существует огромное количество — среди процессоров есть и 16-битные, и 32-битные, и 64-битные. Есть такие, которые умеют выполнять операции с плавающей точкой на аппаратном уровне, какие-то поддерживают операции с двойной точностью, а в каких-то процессорах FPU отсутствует полностью. Процессоры отличаются также внутренним порядком следования байт в слове (big/little endian), как именно процессор работает с внешней памятью, и т.д. и т.п.

И на весь этот зоопарк существует один-единственный Стандарт языка C. Как же это удалось? Вот тут и начинается самое интересное.

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

Синтаксис объявления указателей на функции в С++

Время на прочтение1 мин
Количество просмотров32K
Когда я только начинал использовать С++, то всё время забывал синтаксис определения указателей на функции и особенно указателей на функции члены.

Позже узнал об одном небольшом lifehack'e, который помог мне избавиться от того что-бы держать в голове синтаксис определения указателей на ф-ции. Правда чуть позже этот всё само как-то осело у меня в голове и даже стало очевидно.

На днях показывал этот lifehack одному программисту и решил поделиться им здесь.
Читать дальше →

Перехват вызовов API-функций

Время на прочтение11 мин
Количество просмотров75K
— Папа, я бежал за троллейбусом и сэкономил пять копеек!
— Сынок, бежал бы за такси — сэкономил бы пять рублей!


Сегодня я хочу рассказать вам, как сэкономить 10 тысяч долларов. А заодно, что гораздо менее интересно – научить перехватывать вызовы Win32 API функций, и не только. Хотя, в первую очередь – конечно, именно их.
Читать дальше →

Описание структуры меню без использования ресурсов

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

Вступление


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

Использование traits для обустройства Win32 API

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

Вступление


Всякому известно, что Win32 API не отличается чрезмерным удобством. Например, для вызова функции частенько приходится заполнять большую структуру с полями вроде cbSize, dwFlags и т. д. Или для получения строки сначала узнавать размер ее, готовить буфер и затем лишь получать саму строку. Далее пойдет речь про функцию ::HttpQueryInfo() и применение идиомы «traits» для упрощения работы с ней.
Читать дальше →

Планирование задач в сервере при помощи boost.task

Время на прочтение10 мин
Количество просмотров9.9K
Недавно на профильном ресурсе один программист задал вопрос: «Что использовать в сервере ММО для работы с потоками?». Программист склонялся к Intel TBB, но даже не к базовым примитивам, а к кастомному планированию задач (task scheduling). Ну нравится TBB — ну и ладно. А немного позже я увидел исходники сервера ММО другого программиста, который недавно начал переписываться его с нуля для улучшения архитектуры. И там было очень много велосипедов, которые писались самим программистом вместо того что бы использовать сторонние компоненты такие как boost (к примеру класы обертки над pthread-ом, и это в 2010 году, когда boost.thread уже почти в стандарте). Была там реализована и поддержка пула потоков с планировщиком задач. Тема эта мне очень интересна и я начал копать информацию о готовых решениях планировки задач (как в TBB) и нашел boost.task, про что и решил написать.
Читать дальше →

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