<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919720</guid>
        <pubDate>Mon, 24 Mar 2025 18:18:06 +0000</pubDate>
        <title>В буфере появляется лишний символ</title>
        <link>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919720</link>
        <description><![CDATA[Qraizer: В общем, если кому интересно, то универсальный код преобразования обоих типов ...э-э-э, типов в битовый вид.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;limits&#62;</div><div class="code_line">#include &#60;concepts&#62;</div><div class="code_line">#include &#60;cmath&#62;</div><div class="code_line">#include &#60;bit&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">/* преобразование целых в строку */</div><div class="code_line">std::string TypeToBin(std::integral auto source)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;int const &nbsp; size = std::numeric_limits&#60;unsigned char&#62;::digits * sizeof(source); &nbsp; &nbsp; &nbsp; // размер в битах</div><div class="code_line">&nbsp;&nbsp;std::string str(size, &#39; &#39;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;for (int i = size - 1; i &#62;= 0; i--)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;str[i] = (source &amp; 1) + &#39;0&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;source &#62;&#62;= 1;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;return str;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">/* преобразование вещественных в строку (для не IEEE-совместимых не тестировалось) */</div><div class="code_line">std::string TypeToBin(std::floating_point auto source)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;std::string &nbsp; &nbsp;buf;</div><div class="code_line">&nbsp;&nbsp;int &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;power; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // порядок source</div><div class="code_line">&nbsp;&nbsp;const auto &nbsp; &nbsp;&amp;properties &nbsp; = std::numeric_limits&#60;decltype(source)&#62;{};</div><div class="code_line">&nbsp;&nbsp;const unsigned shiftedPower = static_cast&#60;unsigned&#62;(properties.max_exponent - properties.min_exponent);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;buf.reserve(properties.digits + std::bit_width(shiftedPower) + 3); &nbsp; // + точка, &#39;b&#39; и знак</div><div class="code_line">&nbsp;&nbsp;buf = std::signbit(source) + &#39;0&#39;; &nbsp; &nbsp; // первым знак</div><div class="code_line">&nbsp;&nbsp;if (!std::isfinite(source)) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // проверка на спец.форматы NaN и inf</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;// сначала избавиться от порядка, но сохранить мантиссу (на случай NaN особенно)</div><div class="code_line">&nbsp;&nbsp; &nbsp;// используем бесконечность как образец в памяти ...</div><div class="code_line">&nbsp;&nbsp; &nbsp;decltype(source) pattern = properties.infinity();</div><div class="code_line">&nbsp;&nbsp; &nbsp;const char (&amp;nanByte)[sizeof(pattern)] = reinterpret_cast&#60;const char (&amp;)[sizeof(pattern)]&#62;(pattern);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;char (&amp;srcByte)[sizeof(source)] &nbsp;= reinterpret_cast&#60; &nbsp; &nbsp; &nbsp;char (&amp;)[sizeof(source)]&#62; (source);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// ... и обрабатываем source побайтно, стирая порядок ...</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (int i = 0; i &#60; sizeof(nanByte); ++i)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;srcByte[i] ^= nanByte[i];</div><div class="code_line">&nbsp;&nbsp; &nbsp;// ... а затем заменяем его на несмещённый порядок 0</div><div class="code_line">&nbsp;&nbsp; &nbsp;// это также учтёт явный старший бит, если он есть, т.к. XOR применяется дважды</div><div class="code_line">&nbsp;&nbsp; &nbsp;// + нам пофик на endianess, т.к. он одинаковый для source и pattern</div><div class="code_line">&nbsp;&nbsp; &nbsp;pattern = 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (int i = 0; i &#60; sizeof(nanByte); ++i)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;srcByte[i] ^= nanByte[i];</div><div class="code_line">&nbsp;&nbsp; &nbsp;source = abs(source); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // теперь можно вычислять модуль, в source не спец.формат</div><div class="code_line">&nbsp;&nbsp; &nbsp;// максимальный порядок спец.форматов с учётом его разрядности в типе source, т.к. реализации</div><div class="code_line">&nbsp;&nbsp; &nbsp;// любят в FP_ILOGBNAN совать просто MAX_INT</div><div class="code_line">&nbsp;&nbsp; &nbsp;power = FP_ILOGBNAN &amp; (std::bit_ceil(shiftedPower) - 1);</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;else &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// для остальных форматов всё значительно проще</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;source = abs(source); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // модуль можно сразу</div><div class="code_line">&nbsp;&nbsp; &nbsp;power = logb(source); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // порядок</div><div class="code_line">&nbsp;&nbsp; &nbsp;source= ldexp(source, -power); &nbsp; &nbsp; &nbsp;// чистая мантисса (с порядком 0)</div><div class="code_line">&nbsp;&nbsp; &nbsp;// использовать frexp() нежелательно, т.к. она возвращает мантиссу, сдвинутую в [0.5, 1)</div><div class="code_line">&nbsp;&nbsp; &nbsp;// что уменьшает точность на бит и требует специальной дополнительной обработки её и порядка,</div><div class="code_line">&nbsp;&nbsp; &nbsp;// особенно рядом с std::numeric_limits&#60;&#62;::denorm_min()</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;/* обработать мантиссу */</div><div class="code_line">&nbsp;&nbsp;for (int i = 0; i &#60; properties.digits; ++i)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;buf &nbsp; &nbsp; &nbsp; += static_cast&#60;char&#62;(static_cast&#60;int&#62;(source));</div><div class="code_line">&nbsp;&nbsp; &nbsp;source &nbsp; &nbsp;-= buf.back();</div><div class="code_line">&nbsp;&nbsp; &nbsp;buf.back()+= &#39;0&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;source &nbsp; &nbsp;*= static_cast&#60;decltype(source)&#62;(2);</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;buf.insert(2, 1, &#39;.&#39;); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// добавить точку в buf</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// обработать порядок</div><div class="code_line">&nbsp;&nbsp;buf += &#39;b&#39;;</div><div class="code_line">&nbsp;&nbsp;// power хранит меньшую разрядность, чем способен его тип, например 12 для IEEEшного double,</div><div class="code_line">&nbsp;&nbsp;// поэтому имеет смысл отрезать от него только нужное количество младших бит</div><div class="code_line">&nbsp;&nbsp;buf += TypeToBin(power).substr(std::numeric_limits&#60;decltype(power)&#62;::digits - 1 // знак уже учтён</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; - std::bit_width(shiftedPower / 2)); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // а порядок смещён</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;return buf;</div><div class="code_line">}</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>Требует C++20. Вид битового ...э-э-э, вида вещественных сомнителен. Мне тоже не нравится, но так единообразнее с видом целых. Кому интересно переделать, милости прошу. Знак вещественного просто 0 или 1, знак порядка аналогично. Точка в мантиссе соответственно лежит после второго бита. Мантиссы спец.форматов по возможности разгребаются, но хорошо потестировать поленился. Бесконечности и нечисла распознаются по старшим 011 в порядке, отличаются друг от друга естественно мантиссой. Знаки также распознаются правильно, даже для нуля.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919255</guid>
        <pubDate>Sat, 15 Mar 2025 22:04:17 +0000</pubDate>
        <title>В буфере появляется лишний символ</title>
        <link>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919255</link>
        <description><![CDATA[Majestio: <strong class='tag-b'>tumanovalex</strong>, кстати, я тоже когда-то делал для себя заготовки для работы с битами без STL - <a class='tag-url' href='https://majestio.info/notes/programming/cpp/bit-maps-without-stl.html' target='_blank'>ознакомься</a>  :)  Правда там есть два недостатка: нет проверок индекса на предмет выхода за пределы массива, и нет определения порядка битов в байте для целевой архитектуры. Но это уже всё можно добавить, при желании.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919254</guid>
        <pubDate>Sat, 15 Mar 2025 21:31:54 +0000</pubDate>
        <title>В буфере появляется лишний символ</title>
        <link>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919254</link>
        <description><![CDATA[Majestio: <strong class='tag-b'>Qraizer</strong>, да - всё верно&#33; Перепутал я малёха. Свой пример с <span class="tag-font" data-value="Courier" style="font-family:Courier"><span class="tag-color tag-color-named" data-value="blue" style="color: blue">std::bitset</span></span> я исправил.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919253</guid>
        <pubDate>Sat, 15 Mar 2025 19:46:07 +0000</pubDate>
        <title>В буфере появляется лишний символ</title>
        <link>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919253</link>
        <description><![CDATA[Qraizer: <strong class='tag-b'>Majestio</strong>, ты что-то путаешь. У std::bitset&lt;&gt; нет конструктора, принимающего массив байт. Его конструкторы, принимающие строки в том или ином виде, как обозначение бита рассматривают каждый символ, а не бит. Т.е. можно получить std::bitset&lt;8&gt;(&quot;00110110&quot;).to_ulong() == 0b110110ul (или std::bitset&lt;8&gt;(0b110110ul).to_string() == &quot;00110110&quot;), но не или std::bitset&lt;8&gt;(&quot;01&quot;).to_ulong() == 0b00000001ul]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919249</guid>
        <pubDate>Sat, 15 Mar 2025 07:44:48 +0000</pubDate>
        <title>В буфере появляется лишний символ</title>
        <link>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919249</link>
        <description><![CDATA[tumanovalex: Спасибо, Qraiser и Majestio, за объяснения и код&#33;]]></description>
        <author>tumanovalex</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919246</guid>
        <pubDate>Sat, 15 Mar 2025 03:34:15 +0000</pubDate>
        <title>В буфере появляется лишний символ</title>
        <link>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919246</link>
        <description><![CDATA[Majestio: ADD:<br>
<br>
<strong class='tag-b'>tumanovalex</strong>, если в качестве теста/обучения - нет проблем, экспериментируй. Но если хочется чего-то более предметного, что можно включать в свои проекты - то лучше не изобретать велосипед, а воспользоваться уже готовыми решениями из STL. Вот небольшой примерчик (<strong class='tag-b'><span class="tag-color tag-color-named" data-value="red" style="color: red">ИСПРАВЛЕНО</span></strong>):<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;iostream&#62;</div><div class="code_line">#include &#60;bitset&#62;</div><div class="code_line">#include &#60;array&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">int main() {</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Создаем массив char размером 16 и инициализируем его</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::array&#60;unsigned char, 16&#62; byteArray = {0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x01};</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Создаем bitset, используя массив</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::bitset&#60;128&#62; bits;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (size_t i = 0; i &#60; byteArray.size(); ++i) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;bits &#60;&#60;= 8;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;bits |= byteArray[i];</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Устанавливаем 3-й и предпредпоследний биты</div><div class="code_line">&nbsp;&nbsp; &nbsp;bits.set(2);</div><div class="code_line">&nbsp;&nbsp; &nbsp;bits.set(125);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Выводим результат</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::cout &#60;&#60; bits &#60;&#60; std::endl;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 0;</div></ol></div></div></div></div>]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919245</guid>
        <pubDate>Sat, 15 Mar 2025 03:10:44 +0000</pubDate>
        <title>В буфере появляется лишний символ</title>
        <link>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919245</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=458259&view=findpost&p=3919213'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>tumanovalex &#064; <time class="tag-quote__quoted-time" datetime="2025-03-14T09:43:25+00:00">14.03.25, 09:43</time></span><div class='quote '>можно ли сделать так, чтобы переменная res в main, которой присваивается результат SetBit, зависела от типа первого параметра этой функции?</div></div><br>
Есть вариант, как если вместо <span class="tag-font" data-value="Courier" style="font-family:Courier"><span class="tag-color tag-color-named" data-value="blue" style="color: blue">std::any</span></span> использовать <span class="tag-font" data-value="Courier" style="font-family:Courier"><span class="tag-color tag-color-named" data-value="blue" style="color: blue">auto</span></span>. Вот переписанный вариант от <strong class='tag-b'>Qraizer</strong>:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">int main() </div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;char b = &#39;a&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int &nbsp;c = 257;</div><div class="code_line">&nbsp;&nbsp; &nbsp;short a = -257;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int nBit1 = 15;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int nBit2 = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int nBitValue1 = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int nBitValue2 = 1;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;printf(&quot;GetBit%d = %d\n&quot;, nBit1, GetBit(a, nBit1));</div><div class="code_line">&nbsp;&nbsp; &nbsp;printf(&quot;TypeToBin a &nbsp;= %s\n&quot;, TypeToBin(a).c_str());</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;auto res1 = SetBit(a, nBit1, nBitValue1);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;printf(&quot;res = %d\n&quot;, res1);</div><div class="code_line">&nbsp;&nbsp; &nbsp;printf(&quot;GetBit%d = %d\n&quot;, nBit1, GetBit(res1, nBit1));</div><div class="code_line">&nbsp;&nbsp; &nbsp;printf(&quot;TypeToBin a2 = %s\n&quot;, TypeToBin(res1).c_str());</div><div class="code_line">&nbsp;&nbsp; &nbsp;printf(&quot;GetBit%d = %d\n&quot;, nBit2, GetBit(b, nBit2));</div><div class="code_line">&nbsp;&nbsp; &nbsp;printf(&quot;TypeToBin b &nbsp;= %s\n&quot;, TypeToBin(b).c_str());</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;auto res2 = SetBit(b, nBit2, nBitValue1);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;printf(&quot;res = %d\n&quot;, res2);</div><div class="code_line">&nbsp;&nbsp; &nbsp;printf(&quot;GetBit%d = %d\n&quot;, nBit2, GetBit(res2, nBit2));</div><div class="code_line">&nbsp;&nbsp; &nbsp;printf(&quot;TypeToBin b2 = %s\n&quot;, TypeToBin(res2).c_str());</div><div class="code_line">&nbsp;&nbsp; &nbsp;printf(&quot;GetBit%d = %d\n&quot;, nBit1, GetBit(c, nBit1));</div><div class="code_line">&nbsp;&nbsp; &nbsp;printf(&quot;TypeToBin c &nbsp;= %s\n&quot;, TypeToBin(c).c_str());</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;auto res3 = SetBit(c, nBit1, nBitValue2);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;printf(&quot;res = %d\n&quot;, res3);</div><div class="code_line">&nbsp;&nbsp; &nbsp;printf(&quot;GetBit%d = %d\n&quot;, nBit1, GetBit(res3, nBit1));</div><div class="code_line">&nbsp;&nbsp; &nbsp;printf(&quot;TypeToBin c2 = %s\n&quot;, TypeToBin(res3).c_str());</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;system(&quot;pause&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;return EXIT_SUCCESS;</div><div class="code_line">}</div></ol></div></div></div></div><br>
<strong class='tag-b'>Преимущество:</strong> <span class="tag-font" data-value="Courier" style="font-family:Courier"><span class="tag-color tag-color-named" data-value="blue" style="color: blue">auto</span></span> - явно даёт более &quot;легкий&quot; код по сравнению с <span class="tag-font" data-value="Courier" style="font-family:Courier"><span class="tag-color tag-color-named" data-value="blue" style="color: blue">std::any</span></span>.<br>
<strong class='tag-b'>Недостаток:</strong> если переменную, объявленную как <span class="tag-font" data-value="Courier" style="font-family:Courier"><span class="tag-color tag-color-named" data-value="blue" style="color: blue">auto</span></span>, &quot;переиспользовать&quot;, то можно ожидать сюрпризы, т.к. она получает тип только в момент объявления, а <span class="tag-font" data-value="Courier" style="font-family:Courier"><span class="tag-color tag-color-named" data-value="blue" style="color: blue">std::any</span></span> помнит тип и в процессе переинициализации. Поэтому в своем примере я вынужден был объявлять три разных переменных, и переинициализацию не использовать.<br>
<br>
Ну и вдогоночку замечания, почему так работу с битами лучше не делать:<br>
<br>
1) При последовательном вызове <span class="tag-font" data-value="Courier" style="font-family:Courier"><span class="tag-color tag-color-named" data-value="green" style="color: green">SetBit</span></span>, <span class="tag-font" data-value="Courier" style="font-family:Courier"><span class="tag-color tag-color-named" data-value="green" style="color: green">GetBit</span></span>, <span class="tag-font" data-value="Courier" style="font-family:Courier"><span class="tag-color tag-color-named" data-value="green" style="color: green">TypeOfBin</span></span> очень легко можно перепутать имена переменных, и очень часто это не приведёт к ошибке времени компиляции. А при выполнении будут ошибочные данные. Для этого и придумали инкапсуляцию от ООП. И она часто помогает в таких случаях. Оформляй это классом, а функции оформляй методами.<br>
2) Установка, чтение и печать битов более-менее подойдет только для POD-типов. А вот представь, что ты в качестве источника используешь указатель, к примеру, на 64кб массив char. Хана твоей логике. Для того, чтобы это не случилось - тебе нужно написать метод побайтного доступа к той переменной, с которой будет работать твой класс. Подчеркиваю, только метод доступа - содержимое самой этой переменной дублировать не следует.<br>
3) Индексы установки/чтения битов в методах нужно сразу проверять на выходы за допустимые пределы, иначе будет лабуда&#33;]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919235</guid>
        <pubDate>Fri, 14 Mar 2025 14:24:53 +0000</pubDate>
        <title>В буфере появляется лишний символ</title>
        <link>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919235</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=458259&view=findpost&p=3919213'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>tumanovalex &#064; <time class="tag-quote__quoted-time" datetime="2025-03-14T09:43:25+00:00">14.03.25, 09:43</time></span><div class='quote '>Буду благодарен за любые замечания и предложения</div></div>Работает – и ладно. Я б не так писал. Например, SetBit() используется для установки бита в указанное значение, однако мы привыкли, что установка бита – это конкретно в 1, а если в 0, то это сброс бита. Поэтому интуитивнее видеть не одну функцию, а две setBit() и clearBit() и без указания значения, и так понятно, для какой какое. Или вот GetBit() формально возвращает значение бита, поэтому 0 или 1 понятно. Но мы привыкли, что бит либо взведён либо сброшен, поэтому вместо получения значения и сравнения с чем-то там, просто спрашиваем, взведён ли, и в ответ получаем bool. Но это на любителя.<br>
Но вот что не на любителя... попробуй передать отрицательный номер бита или с большим значением, например, 57. По Стандарту это неопределённое поведение, так что результаты могут удивить. Или вот смешивание C и C++. Зачем printf(), если есть std::cout? А недавно нам Python-овый format() завезли, так вааще лафа.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=458259&view=findpost&p=3919213'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>tumanovalex &#064; <time class="tag-quote__quoted-time" datetime="2025-03-14T09:43:25+00:00">14.03.25, 09:43</time></span><div class='quote '>Возник вопрос: можно ли сделать так, чтобы переменная res в main, которой присваивается результат SetBit, зависела от типа первого параметра этой функции?</div></div>std::any. Некое подобие динамической типизации. Не совсем, но очень похоже: в него можно положить всё, и он помнит, какой тип в него положен, однако при чтении нужно самому знать, что там. Нельзя положить, скажем int, а вытащить строку, бросит эксепшн. Ниже примерный код, основанный на decltype. Тоже очень удобная вещь, но статическая, в динамике тип не определяет.<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">int main()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;char b = &#39;a&#39;;</div><div class="code_line">&nbsp;&nbsp;int &nbsp;c = 257;</div><div class="code_line">&nbsp;&nbsp;short a = -257;</div><div class="code_line">&nbsp;&nbsp;int nBit1 = 15;</div><div class="code_line">&nbsp;&nbsp;int nBit2 = 0;</div><div class="code_line">&nbsp;&nbsp;int nBitValue1 = 0;</div><div class="code_line">&nbsp;&nbsp;int nBitValue2 = 1;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;printf(&quot;GetBit%d = %d\n&quot;, nBit1, GetBit(a, nBit1));</div><div class="code_line">&nbsp;&nbsp;printf(&quot;TypeToBin a &nbsp;= %s\n&quot;, TypeToBin(a).c_str());</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;std::any res = SetBit(a, nBit1, nBitValue1);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;printf(&quot;res = %d\n&quot;, std::any_cast&#60;decltype(a)&#62;(res));</div><div class="code_line">&nbsp;&nbsp;printf(&quot;GetBit%d = %d\n&quot;, nBit1, GetBit(std::any_cast&#60;decltype(a)&#62;(res), nBit1));</div><div class="code_line">&nbsp;&nbsp;printf(&quot;TypeToBin a2 = %s\n&quot;, TypeToBin(std::any_cast&#60;decltype(a)&#62;(res)).c_str());</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;printf(&quot;GetBit%d = %d\n&quot;, nBit2, GetBit(b, nBit2));</div><div class="code_line">&nbsp;&nbsp;printf(&quot;TypeToBin b &nbsp;= %s\n&quot;, TypeToBin(b).c_str());</div><div class="code_line">&nbsp;&nbsp;res = SetBit(b, nBit2, nBitValue1);</div><div class="code_line">&nbsp;&nbsp;printf(&quot;res = %d\n&quot;, std::any_cast&#60;decltype(b)&#62;(res));</div><div class="code_line">&nbsp;&nbsp;printf(&quot;GetBit%d = %d\n&quot;, nBit2, GetBit(std::any_cast&#60;decltype(b)&#62;(res), nBit2));</div><div class="code_line">&nbsp;&nbsp;printf(&quot;TypeToBin b2 = %s\n&quot;, TypeToBin(std::any_cast&#60;decltype(b)&#62;(res)).c_str());</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;printf(&quot;GetBit%d = %d\n&quot;, nBit1, GetBit(c, nBit1));</div><div class="code_line">&nbsp;&nbsp;printf(&quot;TypeToBin c &nbsp;= %s\n&quot;, TypeToBin(c).c_str());</div><div class="code_line">&nbsp;&nbsp;res = SetBit(c, nBit1, nBitValue2);</div><div class="code_line">&nbsp;&nbsp;printf(&quot;res = %d\n&quot;, std::any_cast&#60;decltype(c)&#62;(res));</div><div class="code_line">&nbsp;&nbsp;printf(&quot;GetBit%d = %d\n&quot;, nBit1, GetBit(std::any_cast&#60;decltype(c)&#62;(res), nBit1));</div><div class="code_line">&nbsp;&nbsp;printf(&quot;TypeToBin c2 = %s\n&quot;, TypeToBin(std::any_cast&#60;decltype(c)&#62;(res)).c_str());</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;system(&quot;pause&quot;);</div><div class="code_line">&nbsp;&nbsp;return EXIT_SUCCESS;</div><div class="code_line">}</div></ol></div></div></div></div>Посмотри, мож получится применить.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919233</guid>
        <pubDate>Fri, 14 Mar 2025 13:43:52 +0000</pubDate>
        <title>В буфере появляется лишний символ</title>
        <link>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919233</link>
        <description><![CDATA[tumanovalex: Спасибо&#33; Как я сам не сообразил&#33;]]></description>
        <author>tumanovalex</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919230</guid>
        <pubDate>Fri, 14 Mar 2025 12:48:05 +0000</pubDate>
        <title>В буфере появляется лишний символ</title>
        <link>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919230</link>
        <description><![CDATA[macomics: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=458259&view=findpost&p=3919213'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>tumanovalex &#064; <time class="tag-quote__quoted-time" datetime="2025-03-14T09:43:25+00:00">14.03.25, 09:43</time></span><div class='quote '>Возник вопрос: можно ли сделать так, чтобы переменная res в main, которой присваивается результат SetBit, зависела от типа первого параметра этой функции?</div></div><br>
Можно. Вот так<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">int main()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;//char a = &#39;a&#39;;</div><div class="code_line">&nbsp;//int a = 257;</div><div class="code_line">&nbsp;&nbsp;short res, a = -257;</div><div class="code_line">&nbsp;&nbsp;int nBit = 15;</div><div class="code_line">&nbsp;&nbsp;int nBitValue = 0;</div><div class="code_line">&nbsp;&nbsp;printf(&quot;GetBit%d = %d\n&quot;, nBit, GetBit(a, nBit));</div><div class="code_line">&nbsp;&nbsp;printf(&quot;TypeToBin a &nbsp;= %s\n&quot;, TypeToBin(a).c_str());</div><div class="code_line">&nbsp;&nbsp;res = SetBit(a, nBit, nBitValue);</div><div class="code_line">&nbsp;&nbsp;printf(&quot;res = %d\n&quot;, res);</div><div class="code_line">&nbsp;&nbsp;printf(&quot;GetBit%d = %d\n&quot;, nBit, GetBit(res, nBit));</div><div class="code_line">&nbsp;&nbsp;printf(&quot;TypeToBin a2 = %s\n&quot;, TypeToBin(res).c_str());</div><div class="code_line">&nbsp;&nbsp;system(&quot;pause&quot;);</div><div class="code_line">&nbsp;&nbsp;return EXIT_SUCCESS;</div><div class="code_line">}</div></ol></div></div></div></div>]]></description>
        <author>macomics</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919213</guid>
        <pubDate>Fri, 14 Mar 2025 09:43:25 +0000</pubDate>
        <title>В буфере появляется лишний символ</title>
        <link>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919213</link>
        <description><![CDATA[tumanovalex: Дополнил код считыванием и установкой битов:<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;string&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">template &#60;class T&#62; std::string TypeToBin(T source)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;int const size = 8 * sizeof(T);</div><div class="code_line">&nbsp;&nbsp;std::string str(size, &#39; &#39;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;for (int i = size - 1; i &#62;= 0; i--)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;str[i] = (source &amp; 1) + &#39;0&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;source &#62;&#62;= 1;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;return str;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">template &#60;class T&#62; int GetBit(T source, int nBitNumber)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;int mask = 1 &#60;&#60; nBitNumber;</div><div class="code_line">&nbsp;&nbsp;source = mask &amp; source;</div><div class="code_line">&nbsp;&nbsp;if(source)</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 1;</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 0;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">template &#60;class T&#62; T SetBit(T source, int nBit, int nBitValue)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;int mask = 1 &#60;&#60; nBit;</div><div class="code_line">&nbsp;&nbsp;if (nBitValue == 0)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;mask = ~mask;</div><div class="code_line">&nbsp;&nbsp; &nbsp;source = source &amp; mask; </div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;source = source | mask;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;return source;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">int main()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;//char a = &#39;a&#39;;</div><div class="code_line">&nbsp;//int a = 257;</div><div class="code_line">&nbsp;&nbsp;short a = -257;</div><div class="code_line">&nbsp;&nbsp;int nBit = 15;</div><div class="code_line">&nbsp;&nbsp;int nBitValue = 0;</div><div class="code_line">&nbsp;&nbsp;printf(&quot;GetBit%d = %d\n&quot;, nBit, GetBit(a, nBit));</div><div class="code_line">&nbsp;&nbsp;printf(&quot;TypeToBin a &nbsp;= %s\n&quot;, TypeToBin(a).c_str());</div><div class="code_line">&nbsp;&nbsp;short res = SetBit(a, nBit, nBitValue);</div><div class="code_line">&nbsp;&nbsp;printf(&quot;res = %d\n&quot;, res);</div><div class="code_line">&nbsp;&nbsp;printf(&quot;GetBit%d = %d\n&quot;, nBit, GetBit(res, nBit));</div><div class="code_line">&nbsp;&nbsp;printf(&quot;TypeToBin a2 = %s\n&quot;, TypeToBin(res).c_str());</div><div class="code_line">&nbsp;&nbsp;system(&quot;pause&quot;);</div><div class="code_line">&nbsp;&nbsp;return EXIT_SUCCESS;</div></ol></div></div></div></div>Буду благодарен за любые замечания и предложения. Возник вопрос: можно ли сделать так, чтобы переменная res в main, которой присваивается результат SetBit, зависела от типа первого параметра этой функции? А то при изменении типа анализируемой переменной каждый раз придется изменять и тип переменной res. Проект прикрепил.<br>
<span class="b-attach" data-size="3643" data-hits="84" data-attach-id="66910" data-attach-post-id="3919213">
			<span class="b-attach__title"></span><a class='b-attach-link' href='https://forum.sources.ru/index.php?act=Attach&amp;type=post&amp;id=3919213&amp;attach_id=66910' title='Скачать файл' target='_blank'>cppLearning.zip</a> (, : 84)
		</span>]]></description>
        <author>tumanovalex</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919180</guid>
        <pubDate>Thu, 13 Mar 2025 19:36:50 +0000</pubDate>
        <title>В буфере появляется лишний символ</title>
        <link>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919180</link>
        <description><![CDATA[tumanovalex: Спасибо большое за подробные объяснения и код&#33;]]></description>
        <author>tumanovalex</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919179</guid>
        <pubDate>Thu, 13 Mar 2025 17:35:37 +0000</pubDate>
        <title>В буфере появляется лишний символ</title>
        <link>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919179</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=458259&view=findpost&p=3919173'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>tumanovalex &#064; <time class="tag-quote__quoted-time" datetime="2025-03-13T14:42:33+00:00">13.03.25, 14:42</time></span><div class='quote '>Функции работают нормально. Но хотелось бы сделать так, чтобы в функцию передавать только source, размер типа и буфер создавать в функции и иметь возможность содержимое буфера передавать вызывающей стороне, что-то типа такого:<br>
...<br>
В таком виде printf(&quot;TypeToBin3 a = %s&#092;n&quot;, TypeToBin3(a)) не возвращает правильное содержимое буфера. Подскажите, пожалуйста, как правильно вернуть содержимое буфера, созданного в функции (если это вообще возможно)</div></div>Естественно неправильно. Тут buffer[] является локальным автоматическим объектом, чьё время жизни заканчивается на return, т.ч. возвращаемый указатель указывает в никуда.<br>
На предмет того, чтобы сделать всё правильно, вариантов уйма, и все в той или иной степени подойдут или нет в зависимости от предпочтений. Основная идея – у буфера должен быть владелец.<ol class="tag-list" type="1"><li>Внешний владелец – вызывающий код. Он его создаёт, он его освобождает, когда посчитает нужным, он указывает, куда помещать результат. Так работает TypeToBin1(). Но так тебе неудобно.</li><li>Внутренний владелец – вызываемый код. Он создаёт буфер нужного размера, заполняет его результатом, но удалить его не может, т.к. он нужен вызывающему. Значит он должен передать владение ему, и далее вызывающий будет решать, когда его удалять. Так работает TypeToBin2(), но неправильно.</li><li>Владельцем является сам буфер, и он сам знает, когда уничтожиться. Тут не обойтись без того, чтобы спроектировать архитектуру такого буфера и реализовать её. Обычно, раз у тебя C++, разумнее всего сделать сие классом.</li></ol>Вылечить TypeToBin2() несложно, нужно лишь возвращать результат malloc(), а не какой-то другой, и тогда вызывающий код легко сделает free(), когда ему будет удобно. Это означает, что TypeToBin2() придётся переместить результат к началу буфера, чтобы впереди не было мусора. Но если уж говорить за третий вариант, то у нас уже есть готовые владельцы, например std::vector&lt;&gt; или std::string, так что своего ничего писать не обязательно. Например:<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">template &#60;class T&#62; std::string TypeToBin3(T source)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;int const size = 8 * sizeof(T);</div><div class="code_line">&nbsp;&nbsp;std::string p(size, &#39; &#39;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;for (int i = size - 1; i &#62;= 0; i--)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;p[i] = (source &amp; 1) + &#39;0&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;source &#62;&#62;= 1;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;return p;</div><div class="code_line">}</div></ol></div></div></div></div>std::string сам владеет своим буфером, умеет им управлять и знает, когда его нужно освобождать: когда он сам разрушается. Примерно то же будет с std::vector&lt;char&gt;. Вообще, я давно забыл, когда ловил баги утечки памяти, просто никогда не использую ни malloc()/free(), ни new/delete. Классы, владеющие своими буферами, всё делают за меня и не ошибаются.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919173</guid>
        <pubDate>Thu, 13 Mar 2025 14:42:33 +0000</pubDate>
        <title>В буфере появляется лишний символ</title>
        <link>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919173</link>
        <description><![CDATA[tumanovalex: Переделал функции:<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">template &#60;class T&#62; void TypeToBin1(T source, char* buffer, int size)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;buffer += size;</div><div class="code_line">&nbsp;&nbsp;for (int i = size - 1; i &#62;= 0; i--)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;*--buffer = (source &amp; 1) + &#39;0&#39;; // &#39;0&#39; - 48 &#39;1&#39; - 49 &nbsp;printf(&quot;%p\n&quot;, buffer);</div><div class="code_line">&nbsp;&nbsp; &nbsp;source &#62;&#62;= 1;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">template &#60;class T&#62; void TypeToBin2(T source, char* buffer, int size)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;for (int i = size - 1; i &#62;= 0; i--)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;buffer[i] = (source &amp; 1) + &#39;0&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;source &#62;&#62;= 1;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">}</div></ol></div></div></div></div>Функции работают нормально. Но хотелось бы сделать так, чтобы в функцию передавать только source, размер типа и буфер создавать в функции и иметь возможность содержимое буфера передавать вызывающей стороне, что-то типа такого:<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">template &#60;class T&#62; char* TypeToBin3(T source)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;int const size = 8 * sizeof(T);</div><div class="code_line">&nbsp;&nbsp;char buffer[size + 1];</div><div class="code_line">&nbsp;&nbsp;buffer[size] = &#39;{text}&#39;;</div><div class="code_line">&nbsp;&nbsp;for (int i = size - 1; i &#62;= 0; i--)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;buffer[i] = (source &amp; 1) + &#39;0&#39;; </div><div class="code_line">&nbsp;&nbsp; &nbsp;source &#62;&#62;= 1;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;return buffer;</div><div class="code_line">}</div></ol></div></div></div></div>В таком виде printf(&quot;TypeToBin3 a = %s&#092;n&quot;, TypeToBin3(a)) не возвращает правильное содержимое буфера. Подскажите, пожалуйста, как правильно вернуть содержимое буфера, созданного в функции (если это вообще возможно). <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2025-03-13T14:53:26+00:00">13.03.25, 14:53</time></span></span><br>
Я имел ввиду буфер, который не создается в динамической памяти <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2025-03-13T14:57:40+00:00">13.03.25, 14:57</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=458259&view=findpost&p=3919167'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2025-03-13T13:38:44+00:00">13.03.25, 13:38</time></span><div class='quote '>Формально malloc() может вернуть NULL. Подозреваю, что ему не нравится тот факт, что нет на это поверки <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2025-03-13T13:43:02+00:00">13.03.25, 13:43</time></span></span><br>
P.S. Вторая функция в целом плохо спроектирована. Во-первых, динамический буфер от malloc() должен освобождаться. Помимо того, что я нигде не вижу free(), а увидеть я его мог бы только на вызывающей стороно, т.е. в данном случае в main(), так ещё и вызываемому коду неоткуда взять параметр для free(), т.к. ей приходит не тот же указатель, что вернула malloc(), а насколько-то там увеличенный.</div></div><br>
А как правильно это делается? Надо передавать буфер и параметры, созданные вызывающей стороной? Чтобы она их и освободила?]]></description>
        <author>tumanovalex</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919167</guid>
        <pubDate>Thu, 13 Mar 2025 13:38:44 +0000</pubDate>
        <title>В буфере появляется лишний символ</title>
        <link>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919167</link>
        <description><![CDATA[Qraizer: Формально malloc() может вернуть NULL. Подозреваю, что ему не нравится тот факт, что нет на это поверки <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2025-03-13T13:43:02+00:00">13.03.25, 13:43</time></span></span><br>
P.S. Вторая функция в целом плохо спроектирована. Во-первых, динамический буфер от malloc() должен освобождаться. Помимо того, что я нигде не вижу free(), а увидеть я его мог бы только на вызывающей стороно, т.е. в данном случае в main(), так ещё и вызываемому коду неоткуда взять параметр для free(), т.к. ей приходит не тот же указатель, что вернула malloc(), а насколько-то там увеличенный.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919164</guid>
        <pubDate>Thu, 13 Mar 2025 12:58:17 +0000</pubDate>
        <title>В буфере появляется лишний символ</title>
        <link>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919164</link>
        <description><![CDATA[tumanovalex: Разобрался по своему глупому 1 вопросу - потому что не возвращаю указатель. Если его возвращать, то результат тот же самый. А вот по вопросу № 2 не разобрался.]]></description>
        <author>tumanovalex</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919158</guid>
        <pubDate>Thu, 13 Mar 2025 11:00:25 +0000</pubDate>
        <title>В буфере появляется лишний символ</title>
        <link>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919158</link>
        <description><![CDATA[tumanovalex: Спасибо большое за ответ. Так получилось. Но возникли следующие вопросы:<br>
1. Почему в первой функции такого не происходит? Из-за фиксированного размера буфера?<br>
2. В строке *--p = (source &amp; 1) + &#39;0&#39; или в строке  p[size] = &#39;&#092;0&#39;; появляется предупреждение VC++ &quot;Разыменование пустого указателя, но все работает нормально. Что нужно сделать, чтобы это предупреждение исчезло?]]></description>
        <author>tumanovalex</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919156</guid>
        <pubDate>Thu, 13 Mar 2025 10:44:38 +0000</pubDate>
        <title>В буфере появляется лишний символ</title>
        <link>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919156</link>
        <description><![CDATA[Qraizer: Ну так у тебя p постинкрементится, чтобы в начале следующей итерации указывать на очередной свободный символ, но когда цикл завершается, это свободное место не используется, и там остаётся мусор. Замени, например, на прединкремент, чтобы позиция свободного символа вычислялась на текущей итерации, а не предыдущей.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp;p += size;</div><div class="code_line">&nbsp;&nbsp;for (int i = size - 1; i &#62;= 0; i--)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;*--p = (source &amp; 1) + &#39;0&#39;; // &#39;0&#39; - 48 &#39;1&#39; - 49 &nbsp;printf(&quot;%p\n&quot;, buffer);</div><div class="code_line">&nbsp;&nbsp; &nbsp;source &#62;&#62;= 1;</div><div class="code_line">&nbsp;&nbsp;}</div></ol></div></div></div></div>]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919145</guid>
        <pubDate>Thu, 13 Mar 2025 10:07:07 +0000</pubDate>
        <title>В буфере появляется лишний символ</title>
        <link>https://forum.sources.ru/index.php?showtopic=458259&amp;view=findpost&amp;p=3919145</link>
        <description><![CDATA[tumanovalex: Здравствуйте&#33; <br>
В программе перевода в двоичное число использую 2 функции:<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;stdio.h&#62;</div><div class="code_line">#include &#60;stdlib.h&#62;</div><div class="code_line">#include &#60;string.h&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">template &#60;class T&#62; void TypeToBin(T source, char* buffer, int size)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;buffer += size - 1;</div><div class="code_line">&nbsp;&nbsp;for (int i = size - 1; i &#62;= 0; i--)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;*buffer-- = (source &amp; 1) + &#39;0&#39;; // &#39;0&#39; - 48 &#39;1&#39; - 49 &nbsp;printf(&quot;%p\n&quot;, buffer);</div><div class="code_line">&nbsp;&nbsp; &nbsp;source &#62;&#62;= 1;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">template &#60;class T&#62; char* TypeToBin2(T source)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;int const size = 8 * sizeof(T);</div><div class="code_line">&nbsp;&nbsp;char *p = (char*) malloc(size + 1);</div><div class="code_line">&nbsp;&nbsp;p[size] = &#39;{text}&#39;;</div><div class="code_line">&nbsp;&nbsp;p += size - 1;</div><div class="code_line">&nbsp;&nbsp;for (int i = size - 1; i &#62;= 0; i--)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;*p-- = (source &amp; 1) + &#39;0&#39;; // &#39;0&#39; - 48 &#39;1&#39; - 49 &nbsp;printf(&quot;%p\n&quot;, buffer);</div><div class="code_line">&nbsp;&nbsp; &nbsp;source &#62;&#62;= 1;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;return p;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">int main()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;char a = &#39;a&#39;;</div><div class="code_line">&nbsp;&nbsp;//int a = 1;</div><div class="code_line">&nbsp;&nbsp;int const size = 8 * sizeof(a);</div><div class="code_line">&nbsp;&nbsp;char buffer[size + 1];</div><div class="code_line">&nbsp;&nbsp;buffer[size] = &#39;{text}&#39;;</div><div class="code_line">&nbsp;&nbsp;TypeToBin(a, buffer, size);</div><div class="code_line">&nbsp;&nbsp;printf(&quot;a = %s &nbsp;strlen = %d\n&quot;, buffer, (int) strlen(buffer));</div><div class="code_line">&nbsp;&nbsp;printf(&quot;a = %s\n&quot;, TypeToBin2(a));</div><div class="code_line">&nbsp;&nbsp;printf(&quot;\n&quot;);</div><div class="code_line">&nbsp;&nbsp;system(&quot;pause&quot;);</div><div class="code_line">&nbsp;&nbsp;return EXIT_SUCCESS;</div><div class="code_line">}</div></ol></div></div></div></div>Первая функция TypeToBin выводит строку &quot;a = 01100001  strlen = 8&quot;, а у второй функции TypeToBin2 вывод a = ¤01100001 содержит в начале какой-то символ. Подскажите, пожалуйста, какую ошибку я допустил в этой функции. Проект прикрепил. В архиве файлы проектов дли VС++, CodeBlocks, QtCreator. Причем программы, созданные VC++ и QtCreator, выводят этот дополнительный символ в консоль, а CodeBlocks - нет.<br>
<span class="b-attach" data-size="3086" data-hits="77" data-attach-id="66908" data-attach-post-id="3919145">
			<span class="b-attach__title"></span><a class='b-attach-link' href='https://forum.sources.ru/index.php?act=Attach&amp;type=post&amp;id=3919145&amp;attach_id=66908' title='Скачать файл' target='_blank'>cppLearning.zip</a> (, : 77)
		</span>]]></description>
        <author>tumanovalex</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	