<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Блоги: заметки с тегом си++</title>
<link>https://blogengine.ru/blogs/tags/si-2/</link>
<description>Автоматически собираемая лента заметок, написанных в блогах на Эгее</description>
<author></author>
<language>ru</language>
<generator>Aegea 11.0 (v4079e)</generator>

<itunes:subtitle>Автоматически собираемая лента заметок, написанных в блогах на Эгее</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit>no</itunes:explicit>

<item>
<title>PVS-Studio и «Гопник-2»</title>
<guid isPermaLink="false">132700</guid>
<link>https://bolknote.ru/all/pvs-studio-i-gopnik-2/</link>
<pubDate>Wed, 13 Nov 2024 10:59:43 +0500</pubDate>
<author>Евгений Степанищев</author>
<comments>https://bolknote.ru/all/pvs-studio-i-gopnik-2/</comments>
<description>
&lt;p&gt;&lt;a href="https://bolknote.ru/"&gt;Евгений Степанищев&lt;/a&gt;:&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://bolknote.ru/pictures/2024.11.13@2x.webp" width="1000" height="624" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Много читал об инструменте статического анализ &lt;i&gt;PVS-Studio&lt;/i&gt; — на «Хабре» постоянно выходят статьи с разбором ошибок, которые он помогает найти. Выглядит действительно очень здорово. Несмотря на неизбежные ложные срабатывания, находится много такого, что пропустил программист.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;PVS-Studio&lt;/i&gt; — платный инструмент, но утром за завтраком мне стало интересно, нет ли там какой-нибудь триальной версии, чтобы можно было на практике познакомиться с тем как он настраивается и чем может быть полезным. Оказалось, что у него есть восьмидневная бесплатная лицензия и я решил глянуть что он сможет найти в коде «Гопника-2».&lt;/p&gt;
&lt;p&gt;Нашлось несколько интересных ошибок. На скриншоте одна из них. Как видно, &lt;tt&gt;str_enemy_amount&lt;/tt&gt; проверяется два раза, тогда как после первого условия там гарантировано ноль. Очевидно автор этого куска кода его скопипастил, но забыл во втором куске исправить &lt;tt&gt;enemy&lt;/tt&gt; на &lt;tt&gt;hero&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Я бегло посмотрел все ошибки, которые он мне выдал, надо будет внимательно посмотреть каждую, но как будто бы всё по делу, ноль ложных срабатываний.&lt;/p&gt;
</description>
</item>

<item>
<title>«Гопник-2»: убрал printf</title>
<guid isPermaLink="false">119455</guid>
<link>https://bolknote.ru/all/gopnik-2-ubral-printf/</link>
<pubDate>Fri, 19 May 2023 22:36:48 +0500</pubDate>
<author>Евгений Степанищев</author>
<comments>https://bolknote.ru/all/gopnik-2-ubral-printf/</comments>
<description>
&lt;p&gt;&lt;a href="https://bolknote.ru/"&gt;Евгений Степанищев&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;Закончил &lt;a href="https://bolknote.ru/all/gopnik-2-chto-novogo/"&gt;убирать функцию&lt;/a&gt; &lt;tt&gt;printf&lt;/tt&gt;, сегодня вколотил последний гвоздь в крышку её гроба. Я почему-то наивно полагал, что на этом моя работа по избавлению от &lt;tt&gt;char *&lt;/tt&gt; будет окончена, но не учёл, что в коде довольно много (больше 150) других мест, где ещё используется этот тип.&lt;/p&gt;
&lt;p&gt;В процессе замены встретилось вот такое. Загадка, всё ли хорошо в следующем коде?&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="cpp"&gt;std::cout &amp;lt;&amp;lt; fmt::format(&amp;quot; {}(+{})&amp;quot;, main_hero-&amp;gt;inv[i].name, main_hero-&amp;gt;inv[i].armo)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Мой компилятор считает, что всё, но сборка на «Гитхабе» падает с ошибкой «&lt;i&gt;Binding packed field error&lt;/i&gt;».&lt;/p&gt;
&lt;p&gt;Получается, я по неведомой причине не могу обратиться по ссылке на поле внутри упакованной структуры (&lt;tt&gt;fmt::format&lt;/tt&gt; принимает параметры по ссылке).&lt;/p&gt;
&lt;p&gt;Структуру я пакую, чтобы нивелировать различия на бинарном уровне между компиляторами, — так как я её сохраняю и восстанавливаю как есть. В общем, от упаковки не отказаться, пришлось присвоить значения промежуточным переменным:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="cpp"&gt;const auto name = main_hero-&amp;gt;inv[i].name;
const auto armo = main_hero-&amp;gt;inv[i].armo;

std::cout &amp;lt;&amp;lt; fmt::format(&amp;quot; {}(+{})&amp;quot;, name, armo);&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Выглядит, как костыль, но самое главное — почему один компилятор требует промежуточные переменные, а другой умеет и без них?&lt;/p&gt;
&lt;p&gt;Я бы понял, если бы «Гитхаб» собирал мне бинарники для какой-то экзотической архитектуры, где есть какие-то особенности адресации, но тут такого ведь и в помине нет.&lt;/p&gt;
</description>
</item>

<item>
<title>«Гопник-2»: что нового?</title>
<guid isPermaLink="false">119398</guid>
<link>https://bolknote.ru/all/gopnik-2-chto-novogo/</link>
<pubDate>Tue, 16 May 2023 23:06:18 +0500</pubDate>
<author>Евгений Степанищев</author>
<comments>https://bolknote.ru/all/gopnik-2-chto-novogo/</comments>
<description>
&lt;p&gt;&lt;a href="https://bolknote.ru/"&gt;Евгений Степанищев&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;Можно подумать, что я совсем забросил заниматься игрой «&lt;a href="https://github.com/bolknote/gopnik2"&gt;Гопник-2&lt;/a&gt;», про которую ещё недавно так много писал, но это не так. Просто ничего особо интересного я там пока не делаю, — в основном довольно механически заменяю сишные строки (&lt;tt&gt;char *&lt;/tt&gt;) на сиплюсплюсный класс &lt;tt&gt;std::string&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Недавно &lt;a href="https://bolknote.ru/all/gopnik-2-kontribyutory/"&gt;появившиеся контрибьюторы&lt;/a&gt; добавили мне в проект библиотеку &lt;tt&gt;fmt&lt;/tt&gt;, что упростило работу, — во-первых, теперь не приходится костылить собственные обёртки, чтобы чем-то заменить сишную функцию форматирования &lt;tt&gt;printf&lt;/tt&gt;, а во-вторых, из-за гибкости &lt;tt&gt;fmt&lt;/tt&gt; можно оставлять какие-то места почти нетронутыми, если сходу не удаётся перевести их на новые рельсы. Удобно.&lt;/p&gt;
&lt;p&gt;Осталось примерно 260 замен, не так много, было около 400 или около того.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://bolknote.ru/pictures/2023.05.16@2x.jpg" width="1000" height="178" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Тесты прошли успешно&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Ещё ребята постарались добавить мне тесты. Я ещё не смотрел, но планирую ознакомиться с тем как это делает. Так как на Си++ я раньше не писал, но совершенно без понятия как они тут выглядят, любопытно.&lt;/p&gt;
</description>
</item>

<item>
<title>«Гопник-2»: UTF-8</title>
<guid isPermaLink="false">118020</guid>
<link>https://bolknote.ru/all/gopnik-2-utf-8/</link>
<pubDate>Fri, 07 Apr 2023 13:33:31 +0500</pubDate>
<author>Евгений Степанищев</author>
<comments>https://bolknote.ru/all/gopnik-2-utf-8/</comments>
<description>
&lt;p&gt;&lt;a href="https://bolknote.ru/"&gt;Евгений Степанищев&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;Продолжаю писать про портирование «Гопника-2» под «Виндоуз», ибо там ещё есть о чём рассказать.&lt;/p&gt;
&lt;p&gt;Я уже очень давно не работаю под этой операционной системой, поэтому некоторые обычные, возможно, для многих вещи для меня являются открытием. Когда я начинал процесс портирования игры под эту платформу, я был уверен, что столкнусь в трудностями совершенно в других частях кода. Одной из неожиданностей была плохая работа «Виндоуз» с кодировкой ЮТФ-8.&lt;/p&gt;
&lt;p&gt;Если вывод в консоль &lt;a href="https://bolknote.ru/all/gopnik-2-adaptaciya-pod-windows/"&gt;удалось победить&lt;/a&gt; сравнительно легко, то со вводом возникли проблемы — вызов &lt;tt&gt;SetConsoleCP(CP_UTF8)&lt;/tt&gt;, который должен был помочь, не помог. В интернете пишут, что он, по всей видимости, не реализован — просто не делает ничего.&lt;/p&gt;
&lt;p&gt;Если с латинскими буквами проблем не возникает, они кодируются одним байтом, это ничем не отличается от того как программы до этого работали десятилетиями, а вот с русскими буквами беда — для них требуется два байта и в таком виде Виндоуз их не понимает.&lt;/p&gt;
&lt;p&gt;Рекомендуемый специалистами способ — переключить консоль в режим ввода кодировки ЮТФ-16, а потом перекодировать полученную строку в нужную кодировку. «Виндозу» ЮТФ-16 родная, поэтому проблем вообще никаких не возникает.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="cpp"&gt;#ifdef __MINGW32__
        int wlen = 100;
        int save = _setmode(_fileno(stdin), _O_U16TEXT);
        wchar_t *wstr = (wchar_t *) malloc(wlen * sizeof(wchar_t));
        fgetws(wstr, wlen, stdin);

        int len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, 0, 0, 0, 0);
        user_name = (char *) malloc(len);
        WideCharToMultiByte(CP_UTF8, 0, wstr, -1, user_name, len, 0, 0);
        _setmode(_fileno(stdin), save);

        free(wstr);
#endif&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Мне, к счастью, ввод русских букв нужен только в одном месте — там где игрок вводит своё имя. Я убрал используемую там функцию &lt;tt&gt;fgets&lt;/tt&gt; под условную компиляцию и вставил кусок, который выше. С таким исправлением всё заработало, как ожидается.&lt;/p&gt;
</description>
</item>


</channel>
</rss>