<?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=432284&amp;view=findpost&amp;p=3884531</guid>
        <pubDate>Mon, 09 Jan 2023 03:18:08 +0000</pubDate>
        <title>Реализация многомерного вектора</title>
        <link>https://forum.sources.ru/index.php?showtopic=432284&amp;view=findpost&amp;p=3884531</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=432284&view=findpost&p=3884399'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2023-01-06T07:02:23+03:00">06.01.23, 04:02</time></span><div class='quote '>Я вот попробовал на старых стандартах провести &quot;Операцию Ы&quot; (кристально чистая синтетика), получается, но увы, не так красиво. <br>
Один вопрос пока не знаю - в новейшем стандарте можно ли в operator[] объявлять переменное число аргументов (не вариардик, а именно Си-стайл рантайма)</div></div><br>
Какую же дичь я сморозил&#33;  :blush:<br>
<br>
В приведенном мною примере, когда в коде идет явный вызов оператора[] с разным числом параметров, все вполне решается вариардиком. Ибо еще на этапе компиляции изменение количество размерностей - вполне детерминировано&#33; А вот если заранее неизвестен ход вычислений, и заранее неизвестно изменение размерностей многомерного вектора в каком-то месте кода - в качестве  аргумента можно и нужно передать динамически формируемый вектор индексов. Вот блин :)]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=432284&amp;view=findpost&amp;p=3884520</guid>
        <pubDate>Sun, 08 Jan 2023 18:32:48 +0000</pubDate>
        <title>Реализация многомерного вектора</title>
        <link>https://forum.sources.ru/index.php?showtopic=432284&amp;view=findpost&amp;p=3884520</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=432284&view=findpost&p=3884518'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2023-01-08T18:25:52+00:00">08.01.23, 18:25</time></span><div class='quote '>В том-то и засада, что это хоть и маловосстребованный сегмент рынка ПО, но очень дорогой и безумно ответственный. Так что использование различных автоматизированных средств там приветствуется (конечно, далеко не так всё просто  ) хотя бы потому, что они дают детерминированный результат, в отличие от человека, которому, ну, свойственно.</div></div><br>
Ну да, я там вторую ссылку давал - как раз про ПО самолётов. Там ответственность - не ровня банкоматам и автобусного табло.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=432284&amp;view=findpost&amp;p=3884518</guid>
        <pubDate>Sun, 08 Jan 2023 18:25:52 +0000</pubDate>
        <title>Реализация многомерного вектора</title>
        <link>https://forum.sources.ru/index.php?showtopic=432284&amp;view=findpost&amp;p=3884518</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=432284&view=findpost&p=3884495'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2023-01-08T02:14:27+00:00">08.01.23, 02:14</time></span><div class='quote '>Тут явно одно из условий лишнее, будет ли оно выкинуто в процессе последующей компиляции?</div></div>Оптимизатор его теоретически может выкинуть. Однако инструментатору пофигу, он не оптимизатор, поэтому проинструментирует то, что видит. И после этого оптимизатору уже не отвертеться, вызовы функций из-под сайд-эффектов его рвение однозначно остановят. Так что получишь непокрытие, которого в неинтрументированном коде могло не быть. Но если ты считаешь это недостатком, то нет, сбор покрытия как раз и полезен для выявления мёртвых фрагментов. <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="2023-01-08T18:29:17+00:00">08.01.23, 18:29</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=432284&view=findpost&p=3884517'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2023-01-08T18:25:21+00:00">08.01.23, 18:25</time></span><div class='quote '>высококритичное ПО не доводилось писать</div></div>В том-то и засада, что это хоть и маловосстребованный сегмент рынка ПО, но очень дорогой и безумно ответственный. Так что использование различных автоматизированных средств там приветствуется (конечно, далеко не так всё просто :( ) хотя бы потому, что они дают детерминированный результат, в отличие от человека, которому, ну, свойственно. <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="2023-01-08T18:32:38+00:00">08.01.23, 18:32</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=432284&view=findpost&p=3884518'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2023-01-08T18:25:52+00:00">08.01.23, 18:25</time></span><div class='quote '>Так что получишь непокрытие, которого в неинтрументированном коде могло не быть.</div></div>А впрочем не получишь. Лишнее-нелишнее, но покрыть по MC/DC там всё можно. Но вот если б ты написал<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">if ( (a &#62; 0 || a == 1) &amp;&amp; b &#62; 1) // ...</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>т.е. поменял местами условия, то увы и ах.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=432284&amp;view=findpost&amp;p=3884517</guid>
        <pubDate>Sun, 08 Jan 2023 18:25:21 +0000</pubDate>
        <title>Реализация многомерного вектора</title>
        <link>https://forum.sources.ru/index.php?showtopic=432284&amp;view=findpost&amp;p=3884517</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=432284&view=findpost&p=3884516'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2023-01-08T18:21:52+00:00">08.01.23, 18:21</time></span><div class='quote '>Высококритичное ПО без этого не обходится никак. Но в целом если... если ты когда-нибудь пользовался чем-то типа profile-guided optimization или просто смотрел в среде твоего отладчика, какими путями ты сюда попал (и какие пути вообще были задействованы, это довольно распространённый сервис), то ты однозначно пользовался инструментированием кода. А также если если использовал расширенный профайлинг для чего-то очень точного.<br>
</div></div><br>
Увы, высококритичное ПО не доводилось писать. Как правило UI+DB]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=432284&amp;view=findpost&amp;p=3884516</guid>
        <pubDate>Sun, 08 Jan 2023 18:21:52 +0000</pubDate>
        <title>Реализация многомерного вектора</title>
        <link>https://forum.sources.ru/index.php?showtopic=432284&amp;view=findpost&amp;p=3884516</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=432284&view=findpost&p=3884495'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2023-01-08T02:14:27+00:00">08.01.23, 02:14</time></span><div class='quote '>Но это все же специфическая область разработки.</div></div>Высококритичное ПО без этого не обходится никак. Но в целом если... если ты когда-нибудь пользовался чем-то типа <a class='tag-url' href='https://www.intel.com/content/www/us/en/develop/documentation/cpp-compiler-developer-guide-and-reference/top/compiler-reference/compiler-options/profile-guided-optimization-options.html' target='_blank'>profile-guided optimization</a> или просто смотрел в среде твоего отладчика, какими путями ты сюда попал (и какие пути вообще были задействованы, это довольно распространённый сервис), то ты однозначно пользовался инструментированием кода. А также если когда использовал расширенный профайлинг для чего-то очень точного.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=432284&amp;view=findpost&amp;p=3884495</guid>
        <pubDate>Sun, 08 Jan 2023 02:14:27 +0000</pubDate>
        <title>Реализация многомерного вектора</title>
        <link>https://forum.sources.ru/index.php?showtopic=432284&amp;view=findpost&amp;p=3884495</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=432284&view=findpost&p=3884492'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2023-01-07T20:51:36+00:00">07.01.23, 20:51</time></span><div class='quote '>Говоря об автоматизированных средствах инструментирования кода.</div></div><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=432284&view=findpost&p=3884492'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2023-01-07T20:51:36+00:00">07.01.23, 20:51</time></span><div class='quote '>Не буду подробно это комментировать, должно быть и так понятно. Если кто не понял, мы сейчас о сборе структурного покрытия уровней SC, DC и MC/DC.<br>
Но вот вдруг нужно собрать покрытие MCC. Здесь учитываются не только все условия в решении, но и каждый вход в эти условия:</div></div><br>
Концептуально понятно. Но это все же специфическая область разработки. Пришлось <a class='tag-url' href='https://xakep.ru/2013/09/11/61232/' target='_blank'>почитать это</a>, тогда стало понятнее &quot;зачем&quot;. Ну и <a class='tag-url' href='https://exponenta.ru/storage/app/media/publications/%D0%92%D0%B5%D1%80%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B1%D0%BE%D1%80%D1%82%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE%20%D0%9F%D0%9E%20%D1%81%D0%BE%D0%B3%D0%BB%D0%B0%D1%81%D0%BD%D0%BE%20DO-178C.pdf' target='_blank'>тут немного</a> (10 стр). Увы, мне пока это не интересно, для своих задач не вижу этому прикладного применения. Но для расширения кругозора - годно.<br>
<br>
Чисто ради интереса ... что будет с разбором вот такой конструкции этими средствами:<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">if ( (a == 1 || a &#62; 0) &amp;&amp; b &#62; 1) // ...</div></ol></div></div></div></div><br>
Тут явно одно из условий лишнее, будет ли оно выкинуто в процессе последующей компиляции?]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=432284&amp;view=findpost&amp;p=3884492</guid>
        <pubDate>Sat, 07 Jan 2023 20:51:36 +0000</pubDate>
        <title>Реализация многомерного вектора</title>
        <link>https://forum.sources.ru/index.php?showtopic=432284&amp;view=findpost&amp;p=3884492</link>
        <description><![CDATA[Qraizer: Говоря об автоматизированных средствах инструментирования кода. Вот смотри. У нас есть код типа такого:<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">if (a == b)</div><div class="code_line">&nbsp;&nbsp;x = y;</div><div class="code_line">else</div><div class="code_line">&nbsp;&nbsp;z = t;</div></ol></div></div></div></div>Предположим, нам нужно собрать структурное покрытие блоков. Что делает инструментатор? А вот что:<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">if (a == b){StartBlock(tag1);</div><div class="code_line">&nbsp;&nbsp;x = y; EndBlock(tag1);}</div><div class="code_line">else{StartBlock(tag2);</div><div class="code_line">&nbsp;&nbsp;z = t; EndBlock(tag2);}</div></ol></div></div></div></div>где StartBlock() и EndBlock() его функции сбора статистики, а tag1 и tag2 однозначно указывают на блоки {} кода в его базе, построенной при анализе сырцов. Обычно эти функции просто взводят биты в битовом массиве, изначально обнулённом, так что при анализе собранной в ран-тайм статистики легко определить, какие блоки покрыты, какие нет. Но нередко используются и более сложные действия. Например, если мы захотим оптимизировать размещение кодовых секций для более ёмкого заполнения кеша или переупорядочить блоки условных операторов для более вероятного предсказания ветвлений, то простых битиков будет уже недостаточно. Предположим, мы решили собрать покрытие решений. Тогда вот такой код, казалось бы более простой:<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">if (a == b)</div><div class="code_line">&nbsp;&nbsp;x = y;</div></ol></div></div></div></div>вызовет генерацию примерно такого инструментированного<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">if (AnalyzeDecision(tag1, a == b)){StartBlock(tag1);</div><div class="code_line">&nbsp;&nbsp;x = y; EndBlock(tag1);} else {StartBlock(tag2); EndBlock(tag2);}</div></ol></div></div></div></div>Всё равно появился блок else, но главное – if() теперь тоже не так прост, ведь нужно не только блоки собрать, но и решения, которые привели к тому или иному поведению кода. А ведь они небинарны, они не только либо true, либо false, они ведь ещё могут быть indeterminated, т.е. не исполнялись. Поэтому AnalyzeDecision() уже не просто что-то там битово взводит. Но как бы там ни было, исходное поведение кода инструментатор легко сохраняет, если AnalyzeDecision() будет возвращает свой второй аргумент как результат.<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">if (a == b+d || c == 123)</div><div class="code_line">&nbsp;&nbsp;x = y;</div><div class="code_line">else</div><div class="code_line">&nbsp;&nbsp;z = t;</div></ol></div></div></div></div>Ну что ж, мы уже это проходили:<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">if (AnalyzeCondition(tag1, a == b+d) || AnalyzeCondition(tag2, c == 123))</div><div class="code_line">&nbsp;&nbsp;{StartBlock(tag1); x = y; EndBlock(tag1);}</div><div class="code_line">else</div><div class="code_line">&nbsp;&nbsp;{StartBlock(tag2); z = t; EndBlock(tag2);}</div></ol></div></div></div></div>Не буду подробно это комментировать, должно быть и так понятно. Если кто не понял, мы сейчас о сборе структурного покрытия уровней SC, DC и MC/DC.<br>
Но вот вдруг нужно собрать покрытие MCC. Здесь учитываются не только все условия в решении, но и каждый вход в эти условия:<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">if (AnalyzeCondition(tag1, AnalyzeEntry(tag1, a) == AnalyzeEntry(tag2, b)+AnalyzeEntry(tag3, d)) || AnalyzeCondition(tag2, AnalyzeEntry(tag4, c) == 123))</div><div class="code_line">&nbsp;&nbsp;{StartBlock(tag1); x = y; EndBlock(tag1);}</div><div class="code_line">else</div><div class="code_line">&nbsp;&nbsp;{StartBlock(tag2); z = t; EndBlock(tag2);}</div></ol></div></div></div></div>Он работает, но это неоптимальный сценарий. Здесь требуется хранить много данных, ведь одна и та же переменная может использоваться многократно даже в одном выражении, не говоря уже о других, для которых тоже собираются свои MCC. Поэтому количество различных и уникальных tag для больших проектов огромное, всевозможных комбинаций входов в условиях экспоненциальное, так что элементарно может не хватить даже разрядности целого, не говоря уже о памяти под стастистику. А анализ статистики может занять непомерно огромное время. Поэтому на практике инструментаторы используют гораздо более сложные, но сильно экономящие ресурсы, алгоритмы. Я разбил длинную строку для наглядности, но инструментаторы предпочитают сохранять исходную нумерацию строк. Так людям проще потом анализировать собранное покрытие. Получится что-то типа<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">unsigned __dec, __cond, __eval, __mask;</div><div class="code_line">/* ... */</div><div class="code_line">if ((</div><div class="code_line">&nbsp;&nbsp; &nbsp; __dec &nbsp;= FindDecision(tag1),</div><div class="code_line">&nbsp;&nbsp; &nbsp; __cond = FindCondition(__dec, tag1),</div><div class="code_line">&nbsp;&nbsp; &nbsp; __eval = a == b+d,</div><div class="code_line">&nbsp;&nbsp; &nbsp; __mask = RegisterEntries4(__dec, __cond, a, b, d, c, __eval),</div><div class="code_line">&nbsp;&nbsp; &nbsp; CheckCondition(__dec, __cond, __mask),</div><div class="code_line">&nbsp;&nbsp; &nbsp; __eval</div><div class="code_line">&nbsp;&nbsp; &nbsp;)</div><div class="code_line">&nbsp;&nbsp; &nbsp;||</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp; __cond = FindCondition(__dec, tag2),</div><div class="code_line">&nbsp;&nbsp; &nbsp; __eval = c == 123,</div><div class="code_line">&nbsp;&nbsp; &nbsp; __mask = RegisterEntries4(__dec, __cond, a, b, d, c, __eval),</div><div class="code_line">&nbsp;&nbsp; &nbsp; CheckCondition(__dec, __cond, __mask),</div><div class="code_line">&nbsp;&nbsp; &nbsp; __eval</div><div class="code_line">&nbsp;&nbsp; &nbsp;)</div><div class="code_line">&nbsp;&nbsp; )</div><div class="code_line">{StartBlock(tag1);</div><div class="code_line">&nbsp;&nbsp;x = y; EndBlock(tag1);}</div><div class="code_line">else{StartBlock(tag2);</div><div class="code_line">&nbsp;&nbsp;z = t; EndBlock(tag2);}</div></ol></div></div></div></div>Инструментатор для каждого решения заранее создаёт все возможные варианты, учитывающие true/false/indeterminated и собирает их в массивы. Служебные функции FindDecision() ищет в базе нужные массивы, функция FindCondition() возвращает ссылку на массив возможных исходов для конкретного условия в этом решении, функция RegisterEntriesX() – их несколько, для каждого встреченного в сырцах количества входов в выражениях по одной штуке – регистрирует значения входов в решение, в зависимости от вычисленного __eval это могут быть разные элементы в найденном __cond, но по-любому их количество невелико, т.к. не экспоненциально, а арифметично. В итоге RegisterEntriesX() возвращает реальное что-то, что случилось в реалтайме, и CheckCondition() остаётся лишь сравнить это с тем, что было подготовлено в компайл-тайм. Если ты тут заметил операцию , среди прочих, то ты молодец.<br>
Эту операцию инструментаторы очень любят как раз за её странные качества: вычисление и игнор левого операнда и внесение точки следования перед вычислением правого, и всё это в пределах одного выражения. Сразу предупреждаю, что тут только демонстрация концепций. Реальные инструментаторы могут их реализовывать по-разному. Например, RTRT для MC/DC и MCC массивы условий/решений для приведённого выше выражения (a == b+d || c == 123) формирует в виде строк типа &quot;XXXX&quot;, &quot;1111&quot;, &quot;1113&quot; и &quot;333X&quot;, а вместо функций использует макросы. Там вообще жесть разобраться с нагенеренным, если вдруг приспичит.<br>
Но настоящее веселье начинается, когда инструментатор сталкивается с ?:  :D . Интересно же, как инструментатор выкрутится на:<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">*(a == b ? &amp;x : &amp;z) = (a == b ? y : t);</div></ol></div></div></div></div>который в общем-то аналогичен первому if()? (Ну, почти аналогичен, тут надо, чтобы x и z были подобающих типов, в if() этого не требовалось.) Примерно так:<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">unsigned __tag;</div><div class="code_line">decltype(0 ? &amp;x : &amp;z) __res1;</div><div class="code_line">decltype(0 ? &nbsp;y : &nbsp;t) __res2;</div><div class="code_line">/* ... */</div><div class="code_line">*(__res1 = (AnalyzeDecision(tag1, a == b) ? (__tag = tag1, StartBlock(__tag), &amp;x)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: (__tag = tag2, StartBlock(__tag), &amp;z)),</div><div class="code_line">&nbsp;&nbsp;EndBlock(__tag), __res1) =</div><div class="code_line">&nbsp;(__res2 = (AnalyzeDecision(tag2, a == b) ? (__tag = tag3, StartBlock(__tag), &nbsp;y)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: (__tag = tag4, StartBlock(__tag), &nbsp;t)),</div><div class="code_line">&nbsp;&nbsp;EndBlock(__tag), __res2);</div></ol></div></div></div></div>Как легко увидеть, здесь , понадобилась уже на SC.<br>
<br>
P.S. Что такое tag и с чем их есть. Это просто тэги, навешанные инструментатором на точки наблюдения и собранные в статические базы, когда он анализирует сырцы и генерит инструментированный код. Формально это просто числа, но не всегда, иногда это могут быть целые структуры с кучей доп.инфы. Для них главное быть уникальными и точно идентифицировать точку в коде. Тот факт, что они у меня тут нередко совпадают для разных точек... ну, это смущает, но не противоречит, т.к. тэги для блоков, решений, условий и входов собираются в разные базы и анализируются разными функциями, так что их назначение не пересекается, даже когда они численно равны.<br>
P.P.S. И да, это всё C. А вот с Плюсами гораздо интереснее. У него есть ссылки, нетривиальные классы, которые нельзя вот так просто взять и посохранять и покопировать, шаблоны, для которых решения в одной конкретизации совсем не то же решение, что в другой конкретизации этого же шаблона. Но самый смак – это исключения. Они вносят настолько иногда неожиданные потоки управления, что диву даёшься, как это всё инструментаторы умудряются учитывать. <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="2023-01-07T21:04:24+00:00">07.01.23, 21:04</time></span></span><br>
Это всё к слову о , внутри []. Мне как-то что-то по голове стукнуло, и я решил замутить сортировку без ветвлений. Там и не только , в индексации была.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=432284&amp;view=findpost&amp;p=3884483</guid>
        <pubDate>Sat, 07 Jan 2023 17:44:25 +0000</pubDate>
        <title>Реализация многомерного вектора</title>
        <link>https://forum.sources.ru/index.php?showtopic=432284&amp;view=findpost&amp;p=3884483</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=432284&view=findpost&p=3884482'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2023-01-07T17:38:20+00:00">07.01.23, 17:38</time></span><div class='quote '>С чего бы? Много чести.</div></div><br>
Где-то прочел, сорян, не запомнил где.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=432284&amp;view=findpost&amp;p=3884482</guid>
        <pubDate>Sat, 07 Jan 2023 17:38:20 +0000</pubDate>
        <title>Реализация многомерного вектора</title>
        <link>https://forum.sources.ru/index.php?showtopic=432284&amp;view=findpost&amp;p=3884482</link>
        <description><![CDATA[Qraizer: С чего бы? Много чести. В конце концов это затронет только перегруженные [], которые спецом проектируются под такое использование. Я не читал Стандарт на этот счёт, возможно там есть исключение для токенизаторов, требующее от них переходить к старой семантике , в случае отсутствия подходящих перегрузок. Но даже если и нет, для перегруженных &amp;&amp;, || и , и так есть семантическое исключение: они не вносят точки следования. И даже для &gt;&gt; есть: эта хрень не должна рассматриваться как арифметическая операция в контексте списка аргументов шаблонов. Есть и ещё примеры посложнее, с typename например.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=432284&amp;view=findpost&amp;p=3884464</guid>
        <pubDate>Sat, 07 Jan 2023 06:37:11 +0000</pubDate>
        <title>Реализация многомерного вектора</title>
        <link>https://forum.sources.ru/index.php?showtopic=432284&amp;view=findpost&amp;p=3884464</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=432284&view=findpost&p=3884368'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2023-01-05T17:34:35+00:00">05.01.23, 17:34</time></span><div class='quote '>Хотя, если кто юзал operator,() между [], того ждёт неприятный сюрприз.</div></div><br>
Операция запятая внутри [] по идее будет объявлена как deprecated.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=432284&amp;view=findpost&amp;p=3884462</guid>
        <pubDate>Sat, 07 Jan 2023 05:29:12 +0000</pubDate>
        <title>Реализация многомерного вектора</title>
        <link>https://forum.sources.ru/index.php?showtopic=432284&amp;view=findpost&amp;p=3884462</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=432284&view=findpost&p=3884460'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2023-01-07T00:24:43+00:00">07.01.23, 00:24</time></span><div class='quote '>Когда-то кто-то придумал одним махом получать память сразу под весь массив. Ну вот то ли недопёр до циклов с malloc(), то ли ему были их лень писать. Но почему-то было не лень руками считать индексы. Вот и всё, что могу сказать по этой теме. Единственный профит может быть в том, что единый кусок памяти с большей вероятностью будет лежать в одном кешированном регионе памяти, чем множество блочков поменьше от разных malloc(). Но окупится это лишь в специфических алгоритмах работы с таким массивом.</div></div><br>
Да, возможно еще наверное некоторое ускорение при предварительном резервировании - выделение памяти все же операция относительно не быстрая. Одним участком это гораздо быстрее, чем в циклах мелкими.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=432284&amp;view=findpost&amp;p=3884460</guid>
        <pubDate>Sat, 07 Jan 2023 00:24:43 +0000</pubDate>
        <title>Реализация многомерного вектора</title>
        <link>https://forum.sources.ru/index.php?showtopic=432284&amp;view=findpost&amp;p=3884460</link>
        <description><![CDATA[Qraizer: Формально тебе никто не запрещает написать<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; &nbsp;template &#60;typename ...U&#62; requires(std::same_as&#60;U, std::size_t&#62; &amp;&amp; ...)</div><div class="code_line">&nbsp;&nbsp; &nbsp;auto operator[](U... idx)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;return operator_bl(sizeof...(U), idx...);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div></ol></div></div></div></div>и не надо никакого cstdarg. Та и operator_bl() не надо, в operator[] уже всё есть. Но будет ли с этого всего профит... <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="2023-01-07T00:29:51+00:00">07.01.23, 00:29</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=432284&view=findpost&p=3884399'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2023-01-06T04:02:23+00:00">06.01.23, 04:02</time></span><div class='quote '>Реализация многомерности в виде &quot;проекции&quot; на одномерный вектор - чем-то хороша, или это просто очередной велосипед с квадратными колесами?</div></div>Когда-то кто-то придумал одним махом получать память сразу под весь массив. Ну вот то ли недопёр до циклов с malloc(), то ли ему были их лень писать. Но почему-то было не лень руками считать индексы. Вот и всё, что могу сказать по этой теме.<br>
Единственный профит может быть в том, что единый кусок памяти с большей вероятностью будет лежать в одном кешированном регионе памяти, чем множество блочков поменьше от разных malloc(). Но окупится это лишь в специфических алгоритмах работы с таким массивом.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=432284&amp;view=findpost&amp;p=3884399</guid>
        <pubDate>Fri, 06 Jan 2023 04:02:23 +0000</pubDate>
        <title>Реализация многомерного вектора</title>
        <link>https://forum.sources.ru/index.php?showtopic=432284&amp;view=findpost&amp;p=3884399</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=432284&view=findpost&p=3884396'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2023-01-05T23:24:47+00:00">05.01.23, 23:24</time></span><div class='quote '>ИМХО через initializer_list будет не сложнее, и в производительности не потеряешь, всё равно проверки делать.</div></div><br>
Да, скорее всего, да не - точно ты прав. Я насчёт initializer_list. <br>
Я вот попробовал на старых стандартах провести &quot;Операцию Ы&quot; (кристально чистая синтетика), получается, но увы, не так красиво. <br>
Один вопрос пока не знаю - в новейшем стандарте можно ли в operator[] объявлять переменное число аргументов (не вариардик, а именно Си-стайл рантайма):<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;cstdarg&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">using namespace std;</div><div class="code_line">&nbsp;</div><div class="code_line">template&#60;typename T&#62;</div><div class="code_line">class SimpleClass {</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int dim = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int ret = 0;</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;T&amp; operator_bl(size_t Dim,...) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; if (Dim != dim) throw std::range_error(&quot;Dimension Error&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; ret = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; va_list list;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; va_start(list, Dim); </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; for(int i=0; i&#60;Dim; i++) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; ret += va_arg(list, T);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; va_end(list); </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; cout &#60;&#60; &quot;Get: &quot; &#60;&#60; Dim &#60;&#60; &quot;, Ret: &quot; &#60;&#60; ret &#60;&#60; endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; return ret; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;void setDimension(size_t Dim) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;dim = Dim; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">int main() {</div><div class="code_line">&nbsp;&nbsp; &nbsp;try {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;SimpleClass&#60;int&#62; value;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;value.setDimension(1);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;value.operator_bl(1, 11);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;value.setDimension(2);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;value.operator_bl(2, 22, 33);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;value.operator_bl(3, 1, 1, 1);</div><div class="code_line">&nbsp;&nbsp; &nbsp;} catch (std::exception &amp;err) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;cout &#60;&#60; &quot;Ваапще Лев Лещенко: &quot; &#60;&#60; err.what();</div><div class="code_line">&nbsp;&nbsp; &nbsp;} catch (...) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;cout &#60;&#60; &quot;Случилось штото страшное!&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 0;</div><div class="code_line">}</div></ol></div></div></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">Get: 1, Ret: 11</div><div class="code_line">Get: 2, Ret: 55</div><div class="code_line">Ваапще Лев Лещенко: Dimension Error</div></ol></div></div></div></div><br>
<a class='tag-url' href='https://onlinegdb.com/M4xLq7RYg' target='_blank'>Online there</a> <br>
<br>
Ну а вообще &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">operator[]</span></span> меня радуют. Для многомерных массивов с проекцией на одномерный, но с неизменяемой размерностью - меня радуют&#33;<br>
Последний вопрос к тебе по этой теме. Реализация многомерности в виде &quot;проекции&quot; на одномерный вектор - чем-то хороша, или это просто очередной велосипед с квадратными колесами?]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=432284&amp;view=findpost&amp;p=3884396</guid>
        <pubDate>Thu, 05 Jan 2023 23:24:47 +0000</pubDate>
        <title>Реализация многомерного вектора</title>
        <link>https://forum.sources.ru/index.php?showtopic=432284&amp;view=findpost&amp;p=3884396</link>
        <description><![CDATA[Qraizer: Формально да, но вот как ты её будешь реализовывать, это вопрос. У тебя будет компайл-тайм генерация оператора, и что ты будешь делать, если его вариадик не совпадает с текущей размерностью, определяемой в ран-тайм? Бросить исключение – самый разумный вариант. ИМХО через initializer_list будет не сложнее, и в производительности не потеряешь, всё равно проверки делать.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=432284&amp;view=findpost&amp;p=3884371</guid>
        <pubDate>Thu, 05 Jan 2023 17:43:44 +0000</pubDate>
        <title>Реализация многомерного вектора</title>
        <link>https://forum.sources.ru/index.php?showtopic=432284&amp;view=findpost&amp;p=3884371</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=432284&view=findpost&p=3884368'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2023-01-05T17:34:35+00:00">05.01.23, 17:34</time></span><div class='quote '>В рантайме ты можешь поменять размерность, но на лету сменить синопсис [] не выйдет</div></div><br>
Вот вот поэтому и вопрос тебе задал&#33; Можно будет делать что-то в виде (это вопрос):<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">T&amp; operator[] (size_t Idx1, ...)</div></ol></div></div></div></div><br>
<br>
Иными словами. В зависимости от текущей размерности - указывать разное количество индексов в рантайме.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=432284&amp;view=findpost&amp;p=3884368</guid>
        <pubDate>Thu, 05 Jan 2023 17:34:35 +0000</pubDate>
        <title>Реализация многомерного вектора</title>
        <link>https://forum.sources.ru/index.php?showtopic=432284&amp;view=findpost&amp;p=3884368</link>
        <description><![CDATA[Qraizer: То, о чём ты говоришь, планируется только в C++23 который ещё не ратифицирован. На данный момент эту фичу поддерживают лишь GCC и CLang. И да, если рассматривать весь аспект твоего поста, то это чисто сахар. В рантайме ты можешь поменять размерность, но на лету сменить синопсис [] не выйдет, для этого нужна была бы соответствующая перегрузка, а параметры по умолчанию, поверь, очень плохая идея в этом контексте. Ты можешь накидать в {} какой-нибудь std::initializer_list, но тогда тебе не требуется много операндов, и такое ты и сейчас можешь сделать. Срезы потребуют от тебя промежуточных классов, типа &quot;строка&quot;, &quot;столбец&quot; и &quot;слой&quot; в 3D объекте, но это ты и сейчас можешь. И так и делают со времён C++98. И более того, в многооперандном [] тут вообще нужны не будет, он тупо ничем не поможет.<br>
<br>
В целом, я не вижу выгод от применения этой фичи. Замена [][][]... на [,,,...] сугубо косметическая. Думаю, её приняли исключительно из-за её дешевизны в реализации, и малого риска поломать старый код. Хотя, если кто юзал operator,() между [], того ждёт неприятный сюрприз. В частности, это все автоматизированные средства инструментирования кода.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=432284&amp;view=findpost&amp;p=3884343</guid>
        <pubDate>Thu, 05 Jan 2023 06:24:23 +0000</pubDate>
        <title>Реализация многомерного вектора</title>
        <link>https://forum.sources.ru/index.php?showtopic=432284&amp;view=findpost&amp;p=3884343</link>
        <description><![CDATA[Majestio: Всем привет&#33;<br>
<br>
Вопрос конечно уже поднимался. Простое в лоб решение - делать это с помощью векторов-векторов-...-векторов-типов. Но я вот задумался, а что если многомерность &quot;спроецировать&quot; на одномерный вектор? Даст ли это какие-то преимущества в каких-либо случаях, да и вообще, &quot;стоит ли овчинка выделки&quot;? На сколько я где-то видел, пролетала инфа, что в последней версии стандарта С++ дали возможность в операторе [] использовать не один аргумент, а по количеству от нуля и более. Таким образом, теперь должно быть возможным выражение типа:<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">&nbsp;&nbsp;value = vector[2,3,4];</div><div class="code_line">&nbsp;&nbsp;// что эквивалентно</div><div class="code_line">&nbsp;&nbsp;value = vector.operator[](2,3,4);</div></ol></div></div></div></div><br>
Т.е. смотрится вполне себе более естественно, нежели вызов какой-нить вида:<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">&nbsp;&nbsp;value = vector.at(2,3,4);</div></ol></div></div></div></div><br>
У меня нет компилятора с последним стандартом, но хотелось бы поэкспериментировать с метапрограммированием, где постараться реализовать (если это возможно будет):<br>
<br>
1) Менять количество размерностей в рантайме<br>
2) В операторе[] попробовать задавать переменное количество аргументов для последующего использования с учетом п.1 (если последний стандарт это разрешит)<br>
<br>
Т.е. чистая &quot;синтетика&quot;, для проверки этих возможностей. Да, конечно, в будущем можно попробовать реализовать что-то более практическое, например срезы. <br>
<br>
<strong class='tag-b'>Qraizer</strong>, чё скажешь? ;)  Стоит этим заморачиваться? И если &quot;да&quot;, сможешь накидать простенький шаблонный класс для п.1-п.2?]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	