{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Блоги: заметки с тегом си++",
    "_rss_description": "Автоматически собираемая лента заметок, написанных в блогах на Эгее",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": false,
    "_itunes_explicit": "no",
    "home_page_url": "https:\/\/blogengine.ru\/blogs\/tags\/si-2\/",
    "feed_url": "https:\/\/blogengine.ru\/blogs\/tags\/si-2\/json\/",
    "icon": false,
    "authors": [
        {
            "name": "Илья Бирман",
            "url": "https:\/\/blogengine.ru\/blogs\/",
            "avatar": false
        }
    ],
    "items": [
        {
            "id": "132700",
            "url": "https:\/\/bolknote.ru\/all\/pvs-studio-i-gopnik-2\/",
            "title": "PVS-Studio и «Гопник-2»",
            "content_html": "<div class=\"e2-text-picture\">\n<img src=\"https:\/\/bolknote.ru\/pictures\/2024.11.13@2x.webp\" width=\"1000\" height=\"624\" alt=\"\" \/>\n<\/div>\n<p>Много читал об инструменте статического анализ <i>PVS-Studio<\/i> — на «Хабре» постоянно выходят статьи с разбором ошибок, которые он помогает найти. Выглядит действительно очень здорово. Несмотря на неизбежные ложные срабатывания, находится много такого, что пропустил программист.<\/p>\n<p><i>PVS-Studio<\/i> — платный инструмент, но утром за завтраком мне стало интересно, нет ли там какой-нибудь триальной версии, чтобы можно было на практике познакомиться с тем как он настраивается и чем может быть полезным. Оказалось, что у него есть восьмидневная бесплатная лицензия и я решил глянуть что он сможет найти в коде «Гопника-2».<\/p>\n<p>Нашлось несколько интересных ошибок. На скриншоте одна из них. Как видно, <tt>str_enemy_amount<\/tt> проверяется два раза, тогда как после первого условия там гарантировано ноль. Очевидно автор этого куска кода его скопипастил, но забыл во втором куске исправить <tt>enemy<\/tt> на <tt>hero<\/tt>.<\/p>\n<p>Я бегло посмотрел все ошибки, которые он мне выдал, надо будет внимательно посмотреть каждую, но как будто бы всё по делу, ноль ложных срабатываний.<\/p>\n",
            "date_published": "2024-11-13T10:59:43+05:00",
            "date_modified": "2024-11-13T15:32:17+05:00",
            "tags": [
                "игра «Гопник-2»",
                "программирование",
                "си++"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Wed, 13 Nov 2024 10:59:43 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "132700",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "119455",
            "url": "https:\/\/bolknote.ru\/all\/gopnik-2-ubral-printf\/",
            "title": "«Гопник-2»: убрал printf",
            "content_html": "<p>Закончил <a href=\"https:\/\/bolknote.ru\/all\/gopnik-2-chto-novogo\/\">убирать функцию<\/a> <tt>printf<\/tt>, сегодня вколотил последний гвоздь в крышку её гроба. Я почему-то наивно полагал, что на этом моя работа по избавлению от <tt>char *<\/tt> будет окончена, но не учёл, что в коде довольно много (больше 150) других мест, где ещё используется этот тип.<\/p>\n<p>В процессе замены встретилось вот такое. Загадка, всё ли хорошо в следующем коде?<\/p>\n<pre class=\"e2-text-code\"><code class=\"cpp\">std::cout &lt;&lt; fmt::format(&quot; {}(+{})&quot;, main_hero-&gt;inv[i].name, main_hero-&gt;inv[i].armo)<\/code><\/pre><p>Мой компилятор считает, что всё, но сборка на «Гитхабе» падает с ошибкой «<i>Binding packed field error<\/i>».<\/p>\n<p>Получается, я по неведомой причине не могу обратиться по ссылке на поле внутри упакованной структуры (<tt>fmt::format<\/tt> принимает параметры по ссылке).<\/p>\n<p>Структуру я пакую, чтобы нивелировать различия на бинарном уровне между компиляторами, — так как я её сохраняю и восстанавливаю как есть. В общем, от упаковки не отказаться, пришлось присвоить значения промежуточным переменным:<\/p>\n<pre class=\"e2-text-code\"><code class=\"cpp\">const auto name = main_hero-&gt;inv[i].name;\r\nconst auto armo = main_hero-&gt;inv[i].armo;\r\n\r\nstd::cout &lt;&lt; fmt::format(&quot; {}(+{})&quot;, name, armo);<\/code><\/pre><p>Выглядит, как костыль, но самое главное — почему один компилятор требует промежуточные переменные, а другой умеет и без них?<\/p>\n<p>Я бы понял, если бы «Гитхаб» собирал мне бинарники для какой-то экзотической архитектуры, где есть какие-то особенности адресации, но тут такого ведь и в помине нет.<\/p>\n",
            "date_published": "2023-05-19T22:36:48+05:00",
            "date_modified": "2023-05-19T22:36:41+05:00",
            "tags": [
                "gopnik",
                "игра «Гопник-2»",
                "программирование",
                "си++"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Fri, 19 May 2023 22:36:48 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "119455",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "119398",
            "url": "https:\/\/bolknote.ru\/all\/gopnik-2-chto-novogo\/",
            "title": "«Гопник-2»: что нового?",
            "content_html": "<p>Можно подумать, что я совсем забросил заниматься игрой «<a href=\"https:\/\/github.com\/bolknote\/gopnik2\">Гопник-2<\/a>», про которую ещё недавно так много писал, но это не так. Просто ничего особо интересного я там пока не делаю, — в основном довольно механически заменяю сишные строки (<tt>char *<\/tt>) на сиплюсплюсный класс <tt>std::string<\/tt>.<\/p>\n<p>Недавно <a href=\"https:\/\/bolknote.ru\/all\/gopnik-2-kontribyutory\/\">появившиеся контрибьюторы<\/a> добавили мне в проект библиотеку <tt>fmt<\/tt>, что упростило работу, — во-первых, теперь не приходится костылить собственные обёртки, чтобы чем-то заменить сишную функцию форматирования <tt>printf<\/tt>, а во-вторых, из-за гибкости <tt>fmt<\/tt> можно оставлять какие-то места почти нетронутыми, если сходу не удаётся перевести их на новые рельсы. Удобно.<\/p>\n<p>Осталось примерно 260 замен, не так много, было около 400 или около того.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/bolknote.ru\/pictures\/2023.05.16@2x.jpg\" width=\"1000\" height=\"178\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Тесты прошли успешно<\/div>\n<\/div>\n<p>Ещё ребята постарались добавить мне тесты. Я ещё не смотрел, но планирую ознакомиться с тем как это делает. Так как на Си++ я раньше не писал, но совершенно без понятия как они тут выглядят, любопытно.<\/p>\n",
            "date_published": "2023-05-16T23:06:18+05:00",
            "date_modified": "2023-05-16T23:05:52+05:00",
            "tags": [
                "gopnik",
                "игра «Гопник-2»",
                "си++"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Tue, 16 May 2023 23:06:18 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "119398",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "118020",
            "url": "https:\/\/bolknote.ru\/all\/gopnik-2-utf-8\/",
            "title": "«Гопник-2»: UTF-8",
            "content_html": "<p>Продолжаю писать про портирование «Гопника-2» под «Виндоуз», ибо там ещё есть о чём рассказать.<\/p>\n<p>Я уже очень давно не работаю под этой операционной системой, поэтому некоторые обычные, возможно, для многих вещи для меня являются открытием. Когда я начинал процесс портирования игры под эту платформу, я был уверен, что столкнусь в трудностями совершенно в других частях кода. Одной из неожиданностей была плохая работа «Виндоуз» с кодировкой ЮТФ-8.<\/p>\n<p>Если вывод в консоль <a href=\"https:\/\/bolknote.ru\/all\/gopnik-2-adaptaciya-pod-windows\/\">удалось победить<\/a> сравнительно легко, то со вводом возникли проблемы — вызов <tt>SetConsoleCP(CP_UTF8)<\/tt>, который должен был помочь, не помог. В интернете пишут, что он, по всей видимости, не реализован — просто не делает ничего.<\/p>\n<p>Если с латинскими буквами проблем не возникает, они кодируются одним байтом, это ничем не отличается от того как программы до этого работали десятилетиями, а вот с русскими буквами беда — для них требуется два байта и в таком виде Виндоуз их не понимает.<\/p>\n<p>Рекомендуемый специалистами способ — переключить консоль в режим ввода кодировки ЮТФ-16, а потом перекодировать полученную строку в нужную кодировку. «Виндозу» ЮТФ-16 родная, поэтому проблем вообще никаких не возникает.<\/p>\n<pre class=\"e2-text-code\"><code class=\"cpp\">#ifdef __MINGW32__\n        int wlen = 100;\n        int save = _setmode(_fileno(stdin), _O_U16TEXT);\n        wchar_t *wstr = (wchar_t *) malloc(wlen * sizeof(wchar_t));\n        fgetws(wstr, wlen, stdin);\n\n        int len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, 0, 0, 0, 0);\n        user_name = (char *) malloc(len);\n        WideCharToMultiByte(CP_UTF8, 0, wstr, -1, user_name, len, 0, 0);\n        _setmode(_fileno(stdin), save);\n\n        free(wstr);\n#endif<\/code><\/pre><p>Мне, к счастью, ввод русских букв нужен только в одном месте — там где игрок вводит своё имя. Я убрал используемую там функцию <tt>fgets<\/tt> под условную компиляцию и вставил кусок, который выше. С таким исправлением всё заработало, как ожидается.<\/p>\n",
            "date_published": "2023-04-07T13:33:31+05:00",
            "date_modified": "2024-01-28T00:08:38+05:00",
            "tags": [
                "gopnik",
                "utf8",
                "игра «Гопник-2»",
                "программирование",
                "си++"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Fri, 07 Apr 2023 13:33:31 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "118020",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        }
    ],
    "_e2_version": 4079,
    "_e2_ua_string": "Aegea 11.0 (v4079e)"
}