← All posts tagged CPP

iorlas

Хоть я в старые времена и считал что у буста хорошая документация, сравнивать одни доки boost::regex с python.re даже не хочется, на столько качество разное, хотя вот для буста люди явно старались не мало.

iorlas

Не все знают, но функция c_str() возвращает всегда новый объект, при этом он живёт только в текущем скоупе. Вызвали в функции, вышли из ней — и всё, указатель уже инвалиден. В связи с этим может появиться такой вот баг с DrawText:
1) Создаётся строка wstring до рендерринга.
2) Начинается рендерринг
3) Вызывается DrawText(str.c_str())
4) Включается какой-нибудь хитрый дебаггер.
5) Выход из тела функции рендерринга.
6) Рендерринг текста во внутреннем цикле D3D.
7) Эксепшн.

iorlas

Про-tip #1: Не выёбывайся. У тебя есть какие-то внешние функции какого-то API, где необходимо передавать std::string? Есть необходимость делать хитрые вещи со строками? Да ты ещё и юзаешь чужой API, в котором нужно использовать "тупые" массивы байтов? ТАК НАХУЯ ТЫ БЛЯДЬ ИСПОЛЬЗУЕШЬ std?! НЕ ИСПОЛЬЗУЙ ТЫ ИХ БЛЯДЬ. НЕ ВЫЁБЫВАЙСЯ.
Откуда вытек "совет": сейчас юзаю один код, в котором используется wstring просто так, смеха ради. На деле для красоты. В результате, при подключении стороннего дебаггера, выходила ошибка "аксесс виолейшн эксепшн". Почему? Потому что c_str() функция std::string возвращает временный объект(живёт только в текущем скоупе).
Всё бы ничего, да вот только функция этого API сохраняет адрес в очередь, а затем, уже потом, производит использование этого адреса для получения строки. Вот только если функция задержится пока наша функция не выйдет из скоупа, у нас получится что мы как-бы подставили наш API, дав адрес строки, которой уже и нет.

iorlas

Буст не нужен, если нет цели использовать приложение на линупсе и нет строгого требования отказаться от использования qt. И так, и так будет весить дохуя, вот только если использовать Qt, то кодинг на цпп превращается в кодинг на питоне, когда кодинг с бустом есть минное поле, ради которого приходится жертвовать стольким, делать столько хаков, ебаться столько, что кодить на цпп уже не захочется.

iorlas

Буст, иди нахуй. Оказывается Boost-log не умеет нормально в многопоточность в венде, да и в линупсе не сильно лучше. Кроме того, чтобы врубить autoflush, нужно создавать свой синк(ресурс, куда будет литься логохуйня). В жизни я связываюсь с бустом раз в 40ой. И знаете что? Я могу похвалить только Boost.Asio. Остальное либо глубоко в себе(НИАСИЛИЛ, а зря), либо кэннот инту CLCompiler. Компилер MS, даже с отключенным CLI.

iorlas

У вас проблемы? Не компилится? Выдаёт 4-страничные ошибки? Мистика, магия, ужасы, заговоры против вас? Выключите в проекте поддержку CLR и всё решится само собой!
Жена не любит? На работе не платят? Нет любовницы? Друзья бухают без тебя? Умер тамогочи? В WoW не достался лут? Проблемы с потенцией? Выключи в проекте поддержку CLR и всё будет лучше!

iorlas
? CPP

Кто какие микро/макрофреймворки использует для логирования? Хотел использовать Boost.log, да вот только не работает оно. Примеры древние и не компилятся. А те, что компилятся — не работают, приложение просто падает.

iorlas

Уже 3 часа мучаюсь с проблемой. Скомпилил под MSVS10. Вроде как всё скомпилилось и работало. Скомпилил буст под MSVS11 и пытаюсь скомпилировать тестовый файл. На это получаю ошибку:
1>LINK : fatal error LNK1104: cannot open file 'libboost_log-vc100-mt-gd-1_47.lib'
Как так? Буст сам подключает библиотеки, но не те. Как решать эту проблему?

iorlas

Оказывается, в MSVS 2010 интелли сенс не работает с C++ и CLI. Они просто его отключили, так и сказав: "мы не осилили".
Так вот и ворую сейчас "ультимейт", чтобы поставить "вакс", который тоже придётся воровать.

iorlas

Открыл для себя библиотеку MS Detours. Стоит бешеных денег, но есть ограниченная платная версия и, что самое хорошее, есть древняя версия, в которой есть многое из новейшей платной версии, при этом старая версия не ограничена в распространении.
Что такое MS Detours? Это библиотека для перехвата исполняемых процедур. Проще говоря, это библиотека, которая сама за тебя сделает jmp после выполнения нужной функции, даст возможность выполнить свой код в её теле, а потом вернуть управление оригинальной функции. Иными словами — хороший инструмент для хукинга функций приложений, к которым можно подобраться только через инъекцию DLL.
А использую я её для сервисного приложения, отображающего оверлей в популярных игрушечках(привет, реклама в круизисе и дед айсланде).