<?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=427818&amp;view=findpost&amp;p=3868734</guid>
        <pubDate>Tue, 14 Jun 2022 14:39:48 +0000</pubDate>
        <title>Рекурсия vs итерации</title>
        <link>https://forum.sources.ru/index.php?showtopic=427818&amp;view=findpost&amp;p=3868734</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=427818&view=findpost&p=3868622'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2022-06-14T08:29:37+03:00">14.06.22, 05:29</time></span><div class='quote '>Надо будет ещё то же с SSD сделать.</div></div>Сделал. То же самое, как и ожидалось. Так что скорость дисковой подсистемы в общем-то влияет, конечно, но не качественно. Механизмы оптимизации размещения служебной информации на томе влияют куда сильнее. Допускаю, что на каком-нибудь FAT или ext4 будут совсем другие цифры. (Если у кого под рукой есть никсы, потестите, плз.)<br>
<br>
P.S. На томе SSD его вышеупомянутые 50000 файлов отбирались из общего количества без малого 765000.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427818&amp;view=findpost&amp;p=3868622</guid>
        <pubDate>Tue, 14 Jun 2022 05:29:37 +0000</pubDate>
        <title>Рекурсия vs итерации</title>
        <link>https://forum.sources.ru/index.php?showtopic=427818&amp;view=findpost&amp;p=3868622</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=427818&view=findpost&p=3868322'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2022-06-10T18:19:07+00:00">10.06.22, 18:19</time></span><div class='quote '>Это было на SSD. Дома проверю на HDD</div></div>На HDD разница оказалась лишь количественная, качественно картина та же. Впрочем, фигня это. Понятно, что условия должны быть одинаковы, но предварительный запуск, чтобы одинаковость условий подразумевала кешированность служебных записей тома, ни разу не достоверно отражают реальное положение дел на практике, когда такой кешированности обычно нет.<br>
Поэтому я взял себя в руки и ребутал машину каждый раз. И ждал окончания всех стартовых процедур. Ну, т.е. до прекращения дисковых операций. В итоге рекурсивная версия выдала 114 секунд по разделу с ~20000 файлов *.c (при общем количестве ~615000), нерекурсивный, увы, аж, 172, т.е. в полтора раза медленнее. Надо будет ещё то же с SSD сделать. Но что-то мне подсказывает, что в Win10 дисковый драйвер давно уже оптимизирован именно под рекурсивный обход дерева каталогов. По крайней мере на NTFS, где файловые атрибуты (кроме атрибутов данных разве что) практически всегда лежат в MFT. Просто потому что приложения делают это обычно именно так. <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="2022-06-14T05:33:45+00:00">14.06.22, 05:33</time></span></span><br>
P.S. На случай, если вдруг важно, учитывать ли разницу в регистре символов при поиске по маске, можно чуть переделать создание регулярки:<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">std::regex mask(wildMask, noSens ? std::regex_constants::ECMAScript | std::regex_constants::icase</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : std::regex_constants::ECMAScript);</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script> <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="2022-06-14T05:51:42+00:00">14.06.22, 05:51</time></span></span><br>
P.P.S. Если вдруг надо в ран-тайм определять, различает ли файловая система регистр символов в именах файлов, то тут возникают сложности, т.к. по-хорошему нужно учитывать нюансы локали пользователя, а это отнюдь не однозначная процедура. К примеру, разница между I и i в английском абсолютно не совпадает с таковой в турецком, где есть полный комплект из I, İ, i и ı. Так что я бы рекомендовал сделать предварительно<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">std::locale::global(std::locale(&quot;.utf8&quot;));</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">&nbsp;&nbsp;fs::path tempName1(fs::temp_directory_path() / &quot;CheckCaseSens&quot;s),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tempName2(fs::temp_directory_path() / &quot;checkcasesens&quot;s);</div><div class="code_line">&nbsp;&nbsp;std::ofstream(tempName1, std::ios::ate);</div><div class="code_line">&nbsp;&nbsp;std::ofstream(tempName2, std::ios::ate);</div><div class="code_line">&nbsp;&nbsp;bool isNoCaseSens = fs::equivalent(tempName1, tempName2);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;fs::remove(tempName1);</div><div class="code_line">&nbsp;&nbsp;if (!isNoCaseSens) fs::remove(tempName2);</div></ol></div></div></div></div>должно помочь. Поосторожнее только с последними двумя строчками. 8-) <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="2022-06-14T05:56:12+00:00">14.06.22, 05:56</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=427818&view=findpost&p=3868346'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>mkudritsky &#064; <time class="tag-quote__quoted-time" datetime="2022-06-11T01:47:00+00:00">11.06.22, 01:47</time></span><div class='quote '>Ясное дело, что тип char** не подойдет, так как непонятно - как эффективно выделять память для разного количества файлов?</div></div>Запросто подойдёт. Как и для любого динамически изменяющего свой размер массива, realloc() прекрасно умеет увеличивать размер массива указателей, если есть на это память, конечно. Другое дело, что это будет уже не список, но по факту массив указателей будет эффективней списка указателей. В отличие от массива std::string, который очень вряд ли будет эффективней списка std::string.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427818&amp;view=findpost&amp;p=3868346</guid>
        <pubDate>Sat, 11 Jun 2022 01:47:00 +0000</pubDate>
        <title>Рекурсия vs итерации</title>
        <link>https://forum.sources.ru/index.php?showtopic=427818&amp;view=findpost&amp;p=3868346</link>
        <description><![CDATA[mkudritsky: Немного своих соображений о полностью ansi C коде.<br>
И если для работы со строкой char* существует полно стандартных функций, то вот как вести список найденных строк?<br>
Ясное дело, что тип char** не подойдет, так как непонятно - как эффективно выделять память для разного количества файлов?<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">(char **)calloc(Nfiles, sizeof(char *));</div></ol></div></div></div></div><br>
надо в программе сразу задать максимальное число файлов Nfiles, что до начала поиска неизвестно...<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">// Список файлов</div><div class="code_line">struct pListF {</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Полное имя найденного файла</div><div class="code_line">&nbsp;&nbsp; &nbsp;char *sNameF;</div><div class="code_line">&nbsp;&nbsp; &nbsp;struct pListF</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// Ссылка на структуру с предыдущим файлом (NULL для первого найденного файла)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*pPrivF,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// Ссылка на структуру со следующим файлом (NULL для завершения связанного списка)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*pNextF;</div><div class="code_line">};</div></ol></div></div></div></div><br>
В принципе, первый указатель с списке не нужен, если достаточно работы со списком в одном направлении.<br>
Уничтожаться этот связанный список должен без проблем функцией free (после того, как он становится в программе не нужным).<br>
<br>
P.S. В свое время мне было лень ковыряться с чистым ansi C и я принял решение воспользоваться стандартными средствами C++.]]></description>
        <author>mkudritsky</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427818&amp;view=findpost&amp;p=3868322</guid>
        <pubDate>Fri, 10 Jun 2022 18:19:07 +0000</pubDate>
        <title>Рекурсия vs итерации</title>
        <link>https://forum.sources.ru/index.php?showtopic=427818&amp;view=findpost&amp;p=3868322</link>
        <description><![CDATA[Qraizer: Сравнил-таки. Запустил один раз в холостую и потом уже с замером времени.<br>
Рекурсивный вариант обогнал нерекурсивный на 0,8 секунды при общем времени исполнения 28 секунд. Поиск осуществлялся по маске *.c, найдено в общей сложности чуть более 50000 файлов. В пределах погрешности разницы не замечено. Но вот Cшный код не порадовал, исполнялся втрое медленнее. Понятно, что отнюдь не из-за IO, а из-за неоптимального алгоритма. Слишком много хипа, копирований, кастов char* к std::string итп. И нашёл не все, что по-видимому связано с недочётами в обработке входов dirent. Так, я не увидел заходов в каталоги с русскими буквами и файлов с несколькими точками в именах, типа «package_ti.sysbios.family.c28.f28m35x.c».<br>
Это было на SSD. Дома проверю на HDD <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="2022-06-10T18:22:54+00:00">10.06.22, 18:22</time></span></span><br>
К слову, в моих примерах недочёт: не учитывается разница в регистре символов.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427818&amp;view=findpost&amp;p=3868283</guid>
        <pubDate>Fri, 10 Jun 2022 13:40:23 +0000</pubDate>
        <title>Рекурсия vs итерации</title>
        <link>https://forum.sources.ru/index.php?showtopic=427818&amp;view=findpost&amp;p=3868283</link>
        <description><![CDATA[Qraizer: Попробовал вникнуть в код <strong class='tag-b'>mkudritsky</strong>. Если его рассматривать как Cшный, то вполне приемлемый. Избавиться от list&lt;&gt; и 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">#include &#60;filesystem&#62;</div><div class="code_line">#include &#60;string&#62;</div><div class="code_line">#include &#60;list&#62;</div><div class="code_line">#include &#60;queue&#62;</div><div class="code_line">#include &#60;regex&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">namespace fs = std::filesystem;</div><div class="code_line">using namespace std::literals;</div><div class="code_line">&nbsp;</div><div class="code_line">void makeList(std::list&#60;fs::path&#62;&amp; list, std::string wildMask)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;using fs_do = fs::directory_options;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;for (auto i = 0; i &#60; wildMask.length(); ++i)</div><div class="code_line">&nbsp;&nbsp; &nbsp;if &nbsp; &nbsp; &nbsp;(wildMask[i] == &#39;.&#39;) wildMask.replace(i++, 1, &quot;\.&quot;s);</div><div class="code_line">&nbsp;&nbsp; &nbsp;else if (wildMask[i] == &#39;*&#39;) wildMask.replace(i++, 1, &quot;.*?&quot;s), ++i;</div><div class="code_line">&nbsp;&nbsp; &nbsp;else if (wildMask[i] == &#39;?&#39;) wildMask[i] = &#39;.&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;std::queue&#60;fs::directory_entry&#62; dirs;</div><div class="code_line">&nbsp;&nbsp;std::regex mask(wildMask);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;dirs.push(fs::directory_entry(&quot;.&quot;s));</div><div class="code_line">&nbsp;&nbsp;do</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;fs::path curDir = dirs.front();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;dirs.pop();</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (fs::directory_iterator it(curDir, fs_do::skip_permission_denied); it != fs::directory_iterator(); ++it)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if ( it-&#62;is_directory())</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;dirs.push(*it);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (!it-&#62;is_directory() &amp;&amp; std::regex_match(it-&#62;path().string(), mask))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;list.emplace_back(*it);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp;} while(!dirs.empty());</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">void makeList(std::list&#60;fs::path&#62;&amp; list, std::string wildMask)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;using fs_do = fs::directory_options;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;for (auto i = 0; i &#60; wildMask.length(); ++i)</div><div class="code_line">&nbsp;&nbsp; &nbsp;if &nbsp; &nbsp; &nbsp;(wildMask[i] == &#39;.&#39;) wildMask.replace(i++, 1, &quot;\.&quot;s);</div><div class="code_line">&nbsp;&nbsp; &nbsp;else if (wildMask[i] == &#39;*&#39;) wildMask.replace(i++, 1, &quot;.*?&quot;s), ++i;</div><div class="code_line">&nbsp;&nbsp; &nbsp;else if (wildMask[i] == &#39;?&#39;) wildMask[i] = &#39;.&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;std::regex mask(wildMask);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;for (fs::recursive_directory_iterator it(&quot;.&quot;s, fs_do::skip_permission_denied); it != fs::recursive_directory_iterator(); ++it)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (it-&#62;is_directory()) continue;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (std::regex_match(it-&#62;path().string(), mask))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;list.emplace_back(*it);</div><div class="code_line">&nbsp;&nbsp;}</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=427818&amp;view=findpost&amp;p=3868141</guid>
        <pubDate>Thu, 09 Jun 2022 16:07:20 +0000</pubDate>
        <title>Рекурсия vs итерации</title>
        <link>https://forum.sources.ru/index.php?showtopic=427818&amp;view=findpost&amp;p=3868141</link>
        <description><![CDATA[mkudritsky: Времени пока маловато.<br>
Поэтому выложу поиск файлов, но уже не по маске, а по расширению.<br>
Поиск при помощи рекурсии в Builder.<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">//---------------------------------------------------------------------------</div><div class="code_line">&nbsp;</div><div class="code_line">void &nbsp;ListFilesBuilder(AnsiString path, bool AllDirs, TStringList* List, AnsiString EXT) {</div><div class="code_line">// Функция реализует поиск файлов *.EXT рекурсивно в каталоге path и ниже средствами Builder</div><div class="code_line">// AllDirs=true - файлы ищем в текущем каталоге и рекурсивно ниже; иначе - только в текущем каталоге</div><div class="code_line">// Найденные полные имена файлов помещаются в список List</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; // Создается объект для поиска нужных файлов и каталогов</div><div class="code_line">&nbsp;&nbsp; TSearchRec sr;</div><div class="code_line">&nbsp;&nbsp; // Инициализация поиска - ищется любой файл в директории path.</div><div class="code_line">&nbsp;&nbsp; // &nbsp;Каталоги тоже ищутся. Если поиск завершился успешно, то делаем:</div><div class="code_line">&nbsp;&nbsp; if (FindFirst(path+&quot;*.*&quot;, faAnyFile, sr) == 0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;do {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (sr.Attr &amp; faDirectory) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Если найдена директория, то:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // если она не равна текущей Dir и вышележащей Dir, делаем:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ( (sr.Name != &quot;.&quot;) &amp;&amp; (sr.Name != &quot;..&quot;) &amp;&amp; AllDirs ) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// РЕКУРСИВНО вызываем функцию, но зайдя в найденную директорию</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ListFilesBuilder(path + sr.Name + &quot;\&quot;, true, List, EXT);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} else {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Если же найдена НЕ директория (а файл), то делаем:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Вычисляем расширение найденного файла</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;AnsiString Ext = ExtractFileExt(sr.Name).LowerCase();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ( Ext == EXT ) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Если это расширение равно *.txt, то добавляем полное имя файла в Список</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;List-&#62;Add(path + sr.Name);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// Если поиск очередного файла или директории успешен, то - в начало цикла do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;} while(FindNext(sr) == 0);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// Закрываем процедуру поиска</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;FindClose(sr);</div><div class="code_line">&nbsp;&nbsp; }</div><div class="code_line">&nbsp;&nbsp; Application-&#62;ProcessMessages();</div><div class="code_line">}</div><div class="code_line">//---------------------------------------------------------------------------</div></ol></div></div></div></div>]]></description>
        <author>mkudritsky</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427818&amp;view=findpost&amp;p=3868138</guid>
        <pubDate>Thu, 09 Jun 2022 15:25:57 +0000</pubDate>
        <title>Рекурсия vs итерации</title>
        <link>https://forum.sources.ru/index.php?showtopic=427818&amp;view=findpost&amp;p=3868138</link>
        <description><![CDATA[shm: А чем предмет холивара, можно мне объяснить? В процессоре нет никакой рекурсии, есть стек на базе которого она и получается. Тот же самый стек можно сделать явно в высокоуровневом коде, чтобы &quot;развернуть&quot; рекурсию (для хвостовой можно и без стека). В некоторых случаях такой код будет работать чуть быстрее (и есть возможность явно контролировать потребляемую память). Хотя современные оптимизаторы компиляторов сами могут это делать, по крайней мере для хвостовой рекурсии точно.]]></description>
        <author>shm</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427818&amp;view=findpost&amp;p=3868019</guid>
        <pubDate>Thu, 09 Jun 2022 05:40:42 +0000</pubDate>
        <title>Рекурсия vs итерации</title>
        <link>https://forum.sources.ru/index.php?showtopic=427818&amp;view=findpost&amp;p=3868019</link>
        <description><![CDATA[Gonarh: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=427818&view=findpost&p=3867658'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2022-06-06T17:11:34+00:00">06.06.22, 17:11</time></span><div class='quote '>P.S. Это к вопросу о полезности рекурсий. Любой рекурсивный алгоритм может быть переведён в итерационный и наоборот. Вопрос же &quot;а нужно ли&quot; всегда не имеет однозначного ответа.</div></div><br>
Иногда использую рекурсию, когда точно уверен что глубина не будет больше 8-10 раз.]]></description>
        <author>Gonarh</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427818&amp;view=findpost&amp;p=3868016</guid>
        <pubDate>Wed, 08 Jun 2022 23:20:00 +0000</pubDate>
        <title>Рекурсия vs итерации</title>
        <link>https://forum.sources.ru/index.php?showtopic=427818&amp;view=findpost&amp;p=3868016</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=427818&view=findpost&p=3867991'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>mkudritsky &#064; <time class="tag-quote__quoted-time" datetime="2022-06-08T17:16:16+00:00">08.06.22, 17:16</time></span><div class='quote '>Ведь файловая система - это дерево.</div></div><br>
Это было так раньше ;) В *nix давно существовали хард и софт линки. В винде, на NTFS тоже можно делать <a class='tag-url' href='https://ru.wikipedia.org/wiki/%D0%A2%D0%BE%D1%87%D0%BA%D0%B0_%D1%81%D0%BE%D0%B5%D0%B4%D0%B8%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_NTFS' target='_blank'>точки соединения</a> (по сути аналог хард-линков). Поэтому при обходе нужно это нужно учитывать, особенно если &quot;потомок&quot; включает линком верхние родительские каталоги. <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">DIR /AL /S C:\</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=427818&amp;view=findpost&amp;p=3868005</guid>
        <pubDate>Wed, 08 Jun 2022 19:49:52 +0000</pubDate>
        <title>Рекурсия vs итерации</title>
        <link>https://forum.sources.ru/index.php?showtopic=427818&amp;view=findpost&amp;p=3868005</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=427818&view=findpost&p=3867991'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>mkudritsky &#064; <time class="tag-quote__quoted-time" datetime="2022-06-08T17:16:16+00:00">08.06.22, 17:16</time></span><div class='quote '>Программа написана на C++ ...</div></div>А чё не std::filesystem? Не пришлось бы городить зоопарк на препроцессоре. Какие-то malloc/free зачем-то... Я бы не назвал это C++, скорее суржик какой-то на двух языках.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427818&amp;view=findpost&amp;p=3868004</guid>
        <pubDate>Wed, 08 Jun 2022 19:42:26 +0000</pubDate>
        <title>Рекурсия vs итерации</title>
        <link>https://forum.sources.ru/index.php?showtopic=427818&amp;view=findpost&amp;p=3868004</link>
        <description><![CDATA[Qraizer: Выделил в отдельную тему, заслуживает. Автоудаление отменено.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427818&amp;view=findpost&amp;p=3867991</guid>
        <pubDate>Wed, 08 Jun 2022 17:16:16 +0000</pubDate>
        <title>Рекурсия vs итерации</title>
        <link>https://forum.sources.ru/index.php?showtopic=427818&amp;view=findpost&amp;p=3867991</link>
        <description><![CDATA[mkudritsky: Пока верхние сообщения не удалены автоудалением, выложу код программы поиска набора файлов по маске.<br>
Без рекурсии.<br>
Кстати, может программа и пригодится автору ветки. Ведь файловая система - это дерево.<br>
Программа написана на C++, но переделывается на ansi C несложно (мне просто было лень оперировать с char* вместо строк и с char** вместо списка строк):<br>
Софт, разумеется, кроссплатформенный (Win, Linux). <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 defined(_WIN32) || defined(_WIN64) || defined(__CYGWIN__)</div><div class="code_line">#define WINDOWS</div><div class="code_line">#elif defined(__linux__)</div><div class="code_line">#define Linux</div><div class="code_line">#elif defined(__APPLE__) || defined(__MACH__)</div><div class="code_line">#define MacOS</div><div class="code_line">#elif defined(__FreeBSD__)</div><div class="code_line">#define FreeBSD</div><div class="code_line">#elif defined(__ANDROID__)</div><div class="code_line">#define Android</div><div class="code_line">#elif defined(sun) || defined(__sun)</div><div class="code_line">#if defined(__SVR4) || defined(__svr4__)</div><div class="code_line">#define SOLARIS</div><div class="code_line">#else</div><div class="code_line">#define SunOS</div><div class="code_line">#endif</div><div class="code_line">#elif defined(__QNX__) || defined(__QNXNTO__)</div><div class="code_line">#define QNX</div><div class="code_line">#else</div><div class="code_line">#error Unknown OS</div><div class="code_line">#endif</div><div class="code_line">&nbsp;</div><div class="code_line">#ifdef WINDOWS</div><div class="code_line">#define _GNU_SOURCE</div><div class="code_line">#endif</div><div class="code_line">&nbsp;</div><div class="code_line">#include &#60;string.h&#62;</div><div class="code_line">#include &#60;iostream&#62;</div><div class="code_line">#include &#60;fstream&#62;</div><div class="code_line">#include &#60;algorithm&#62;</div><div class="code_line">#include &#60;vector&#62;</div><div class="code_line">#include &#60;list&#62;</div><div class="code_line">#include &#60;sys/stat.h&#62;</div><div class="code_line">#include &#60;dirent.h&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">#ifndef WINDOWS</div><div class="code_line">char cSl = &#39;/&#39;;</div><div class="code_line">#else</div><div class="code_line">char cSl = &#39;\&#39;;</div><div class="code_line">#endif</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">//----------------------------------------------------------------------------------------------------</div><div class="code_line">&nbsp;</div><div class="code_line">void &nbsp;ListFiles(string path, bool AllDirs, list&#60;string&#62;* List, string name) {</div><div class="code_line">// Функция поиска файлов с именем name (с маской) рекурсивно в каталоге path (ПОЛНОЕ ИМЯ) и ниже</div><div class="code_line">// AllDirs=true - файлы ищем в текущем каталоге и рекурсивно ниже; иначе - только в текущем каталоге</div><div class="code_line">// Найденные файлы сохраняются в списке List</div><div class="code_line">&nbsp;&nbsp; // Связанный список деревьев-директорий</div><div class="code_line">&nbsp;&nbsp; struct Tdir {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; DIR &nbsp;*Dcurr; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Текущая директория</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; char *Dname; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Имя текущей директории (без правого слэша)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; struct dirent *Fcurr; // Указатель по поддиректориям/файлам в текущей директории</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; struct Tdir *Dpriv, &nbsp; // Ссылка на родительскую директорию</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *Dnext; &nbsp; // Ссылка на дочернюю поддиректорию (заходим по одной поддиректории!)</div><div class="code_line">&nbsp;&nbsp; };</div><div class="code_line">&nbsp;&nbsp; // Определение типа ОС, вычисление слэша и обработка path</div><div class="code_line">&nbsp;&nbsp; while ((path.length() &#62; 1) &amp;&amp; (path[path.length() - 1] == cSl))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; path.erase(path.length() - 1);</div><div class="code_line">&nbsp;&nbsp; // Работа в начальной директории</div><div class="code_line">&nbsp;&nbsp; struct Tdir *pDIR, *pDcurr; // Начальная директория и текущая (под)директория</div><div class="code_line">&nbsp;&nbsp; pDIR = &nbsp;(struct Tdir*)malloc(sizeof(struct Tdir));</div><div class="code_line">&nbsp;&nbsp; // Открываем начальную директорию</div><div class="code_line">&nbsp;&nbsp; pDIR-&#62;Dname = (char *)calloc(path.length() + 1, sizeof(char));</div><div class="code_line">&nbsp;&nbsp; strcpy(pDIR-&#62;Dname, path.c_str());</div><div class="code_line">&nbsp;&nbsp; pDIR-&#62;Dcurr = opendir(pDIR-&#62;Dname);</div><div class="code_line">&nbsp;&nbsp; if (pDIR-&#62;Dcurr == NULL) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; free(pDIR-&#62;Dname);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; free(pDIR);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; return;</div><div class="code_line">&nbsp;&nbsp; }</div><div class="code_line">&nbsp;&nbsp; pDIR-&#62;Dnext = pDIR-&#62;Dpriv = NULL;</div><div class="code_line">&nbsp;&nbsp; // Читаем начальную директорию</div><div class="code_line">&nbsp;&nbsp; pDIR-&#62;Fcurr = readdir(pDIR-&#62;Dcurr);</div><div class="code_line">&nbsp;&nbsp; // Присваиваем текущей директории значение начальной</div><div class="code_line">&nbsp;&nbsp; pDcurr = pDIR;</div><div class="code_line">&nbsp;&nbsp; // Главный цикл продолжается до тех пор, пока не будет закрыта начальная директория</div><div class="code_line">&nbsp;&nbsp; while (pDIR-&#62;Fcurr != NULL) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; string sPath;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; // Цикл по файлам/поддиректориям текущей директории</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; while (pDcurr-&#62;Fcurr != NULL) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sPath = string(pDcurr-&#62;Dname);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Короткое имя очередного файла/поддиректории в текущей директории</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; string sFcurr = pDcurr-&#62;Fcurr-&#62;d_name;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Полное имя очередного файла/поддиректории в текущей директории</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sPath.push_back(cSl); // Добавление слэша</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sPath = sPath + sFcurr;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Определяем атрибуты очередного файла/поддиректории в текущей директории</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; struct stat attr;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int iSt = stat(sPath.c_str(), &amp;attr);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Дальнейшая работа - только если атрибуты определены правильно</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!iSt) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Работа с очередной поддиректорией</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (attr.st_mode &amp; S_IFDIR) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ((sFcurr != &quot;.&quot;) &amp;&amp; (sFcurr != &quot;..&quot;) &amp;&amp; AllDirs ) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Переход в очередную дочернюю поддиректорию и делаем ее текущей директорией</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pDcurr-&#62;Dnext = (struct Tdir*)malloc(sizeof(struct Tdir));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pDcurr-&#62;Dnext-&#62;Dname = (char *)calloc(sPath.length() + 1, sizeof(char));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strcpy(pDcurr-&#62;Dnext-&#62;Dname, sPath.c_str());</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pDcurr-&#62;Dnext-&#62;Dcurr = opendir(pDcurr-&#62;Dnext-&#62;Dname);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (pDcurr-&#62;Dnext-&#62;Dcurr != NULL) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pDcurr-&#62;Dnext-&#62;Dnext = NULL;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pDcurr-&#62;Dnext-&#62;Dpriv = pDcurr;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Переход в очередную дочернюю поддиректорию (становится текущей)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pDcurr = pDcurr-&#62;Dnext;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Если очередную (дочернюю) поддиректорию не удается открыть - возвращаем память</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; free(pDcurr-&#62;Dnext-&#62;Dname);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; free(pDcurr-&#62;Dnext);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pDcurr-&#62;Dnext = NULL;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Работа с очередным файлом</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Сравнение шаблона и имени файла чувствительно к регистру!</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bool bc = true, bz; // флаг добавления файла по маске и флаг проверки символа &quot;*&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int iz = -1; // Символ, следующий сразу за (последовательностью) символом &quot;*&quot; (и &quot;?&quot; - необбязательный)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; unsigned int ic = 0, in = 0, iv; // Счетчики символов sFcurr, name и числа символов &quot;?&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (name.length()) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while ((ic &#60; sFcurr.length()) &amp;&amp; (in &#60; name.length())) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Считаем символы &quot;*&quot; и &quot;?&quot; и запоминаем информацию об этом</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; iv = 0; bz = false;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while((in &#60; name.length()) &amp;&amp; ((name[in] == &#39;*&#39;) || (name[in] == &#39;?&#39;))) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Есть символ &quot;*&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (name[in] == &#39;*&#39;) {bz = true;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Считаем число символов &quot;?&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else {iv++;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; in++;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Запоминаем символ, следующий за последовательностью &quot;*&quot; (и &quot;?&quot;)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (bz) {iz = in;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Работа с символами sFcurr по части масок из подряд идущих &quot;*&quot; и &quot;?&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (bz) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; unsigned int iSum = 0; // Подсчет числа символов до name[in]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while ((ic &#60; sFcurr.length()) &amp;&amp; (in &#60; name.length()) &amp;&amp; (sFcurr[ic] != name[in]))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {ic++; iSum++;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (iSum &#60; iv)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {bc = false; break;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Работа только с подряд идущими символами &quot;?&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else if (iv) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ic += iv;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (ic &#62; sFcurr.length())</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {bc = false; break;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Проверка обычных символов</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ((ic &#60; sFcurr.length()) &amp;&amp; (in &#60; name.length()) &amp;&amp; (sFcurr[ic] != name[in])) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (iz &#60; 0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bc = false; break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; in = iz;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while ((ic &#60; sFcurr.length()) &amp;&amp; (in &#60; name.length()) &amp;&amp; (sFcurr[ic] != name[in]))</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; { ic++; }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Переходы к следующим символам в строке и в маске</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ic++; in++;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {bc = false;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Проверка, что все символы проверяемой строки прочитаны</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (ic &#60; sFcurr.length())</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {bc = false;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Проверка, что все символы шаблона прочитаны (остаться могут только &quot;*&quot;)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while (in &#60; name.length()) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (name[in] != &#39;*&#39;) {bc = false; break;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; in++;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ( bc )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {List-&#62;push_back(sPath);}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Читаем очередной файл или поддиректорию в текущей директории</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pDcurr-&#62;Fcurr = readdir(pDcurr-&#62;Dcurr);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; // Закрытие текущей директории</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; closedir(pDcurr-&#62;Dcurr);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; pDcurr-&#62;Dcurr = NULL;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; // Переход в родительскую директорию, если она существует</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; if (pDcurr-&#62;Dpriv) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pDcurr = pDcurr-&#62;Dpriv;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; free(pDcurr-&#62;Dnext-&#62;Dname);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; free(pDcurr-&#62;Dnext);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pDcurr-&#62;Dnext = NULL;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pDcurr-&#62;Fcurr = readdir(pDcurr-&#62;Dcurr);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; }</div><div class="code_line">&nbsp;&nbsp; }</div><div class="code_line">&nbsp;&nbsp; free(pDIR-&#62;Dname);</div><div class="code_line">&nbsp;&nbsp; free(pDIR);</div><div class="code_line">}</div><div class="code_line">//---------------------------------------------------------------------------</div></ol></div></div></div></div>]]></description>
        <author>mkudritsky</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427818&amp;view=findpost&amp;p=3867673</guid>
        <pubDate>Mon, 06 Jun 2022 19:21:39 +0000</pubDate>
        <title>Рекурсия vs итерации</title>
        <link>https://forum.sources.ru/index.php?showtopic=427818&amp;view=findpost&amp;p=3867673</link>
        <description><![CDATA[Majestio: <strong class='tag-b'>mkudritsky</strong>, смею предположить, что твои выводы о &quot;разах&quot; немного приукрашены. И объясню почему ... небойсь под виндой, люниксом или макосом тестил? То-то и оно&#33; В одном тесте тебе грузят обновление винды, в другом обновляют зеркала аптейтов люникса... В итоге замеряешь в том, что тебе &quot;позволила&quot; операционная система. Чтобы понимать о чем я говорю - приведу аналог. Дали близорукому бухгалтеру испытать на точность и разброс три дальнобойные винтовки с оптическим прицелом ... продолжение истории, думаю, очевидно. Это частая беда любителей бэйнчмарков. Им кажется, что увеличение количеств повторений может дать какое-то достоверное &quot;среднее&quot;, ни на чем не обоснованная уверенность.<br>
<br>
Более-менее достоверные результаты можно получить на ОСРВ, типа QNX. Там система заточена на &quot;честное квантование&quot; вычислений. А. как по мне, лучший вариант - это какая-то однозадачная ОС типа DOS с минимумом драйверов, которые насилуют прерывания таймера. И обязательно на железном (не виртуальном) железе.<br>
<br>
Ну это так ... к слову  ;)]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427818&amp;view=findpost&amp;p=3867670</guid>
        <pubDate>Mon, 06 Jun 2022 18:59:55 +0000</pubDate>
        <title>Рекурсия vs итерации</title>
        <link>https://forum.sources.ru/index.php?showtopic=427818&amp;view=findpost&amp;p=3867670</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=427818&view=findpost&p=3867658'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2022-06-06T17:11:34+00:00">06.06.22, 17:11</time></span><div class='quote '>Вопрос же &quot;а нужно ли&quot; всегда не имеет однозначного ответа.</div></div><br>
Ну нееет - не всегда. Если тебе данные кагбэ намекают, что стек ты &quot;съешь&quot; не просчитав и десятой части на предполагаемых данных - нафик мучать стек, нужно переводить в итерации..]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427818&amp;view=findpost&amp;p=3867658</guid>
        <pubDate>Mon, 06 Jun 2022 17:11:34 +0000</pubDate>
        <title>Рекурсия vs итерации</title>
        <link>https://forum.sources.ru/index.php?showtopic=427818&amp;view=findpost&amp;p=3867658</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=427818&view=findpost&p=3867535'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2022-06-05T09:01:39+00:00">05.06.22, 09:01</time></span><div class='quote '>Кто-нибудь догадается, что такое эта f_nm()?</div></div>Что, никто? Подсказываю: это дважды рекурсивная функция, названная именем математика. Его же имя носит один из нетривиальных счётных ординалов. Операции +3 и -3 и константа 2 в её тексте должны тоже намекать.<br>
<br>
P.S. Это к вопросу о полезности рекурсий. Любой рекурсивный алгоритм может быть переведён в итерационный и наоборот. Вопрос же &quot;а нужно ли&quot; всегда не имеет однозначного ответа.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427818&amp;view=findpost&amp;p=3867535</guid>
        <pubDate>Sun, 05 Jun 2022 09:01:39 +0000</pubDate>
        <title>Рекурсия vs итерации</title>
        <link>https://forum.sources.ru/index.php?showtopic=427818&amp;view=findpost&amp;p=3867535</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=427818&view=findpost&p=3867500'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>mkudritsky &#064; <time class="tag-quote__quoted-time" datetime="2022-06-05T02:34:53+00:00">05.06.22, 02:34</time></span><div class='quote '>Можно и я влезу? (Может быть невпопад).<br>
...<br>
Программирование без рекурсии будет посложнее, но оно того стоит.</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">unsigned long op(unsigned long x, unsigned long y, int n)</div><div class="code_line">{</div><div class="code_line">&nbsp;if(n==0) x=n=1;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;std::vector&#60;unsigned long&#62; res(n+1);</div><div class="code_line">&nbsp;std::vector&#60;unsigned long&#62; tmp(n);</div><div class="code_line">&nbsp;std::vector&#60;unsigned long&#62; idx(n);</div><div class="code_line">&nbsp;int &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;lev=n-1;</div><div class="code_line">&nbsp;unsigned long &nbsp;temp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;tmp[lev]=y;</div><div class="code_line">&nbsp;res[lev]=x;</div><div class="code_line">&nbsp;idx[lev]=1;</div><div class="code_line">&nbsp;do</div><div class="code_line">&nbsp;&nbsp;if(lev==0)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; temp=x+tmp[lev];</div><div class="code_line">&nbsp;&nbsp; do</div><div class="code_line">&nbsp;&nbsp; &nbsp;res[++lev]=temp;</div><div class="code_line">&nbsp;&nbsp; while(lev!=n &amp;&amp; ++idx[lev] &#62;= tmp[lev]);</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; tmp[lev-1]=res[lev];</div><div class="code_line">&nbsp;&nbsp; res[--lev]=x;</div><div class="code_line">&nbsp;&nbsp; idx[lev]=1;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;while(lev!=n);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;temp=res[lev];</div><div class="code_line">&nbsp;return temp;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">unsigned long f_nm(unsigned long m, unsigned long n)</div><div class="code_line">{</div><div class="code_line">&nbsp;return op(2, n+3, static_cast&#60;int&#62;(m))-3;</div><div class="code_line">}</div></ol></div></div></div></div>Кто-нибудь догадается, что такое эта f_nm()?]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427818&amp;view=findpost&amp;p=3867500</guid>
        <pubDate>Sun, 05 Jun 2022 02:34:53 +0000</pubDate>
        <title>Рекурсия vs итерации</title>
        <link>https://forum.sources.ru/index.php?showtopic=427818&amp;view=findpost&amp;p=3867500</link>
        <description><![CDATA[mkudritsky: Можно и я влезу? (Может быть невпопад).<br>
При поиске по структурам рекомендую отказаться от использования рекурсии, которой так гордятся в C/C++.<br>
Программирование без рекурсии будет посложнее, но оно того стоит.<br>
<br>
Имею опыт отказа от рекурсии в двух задачах поиска.<br>
В обоих случаях скорость поиска возросла в <strong class='tag-b'>ТРИ-ЧЕТЫРЕ</strong> (&#33;&#33;&#33;) раза&#33;<br>
<br>
Какие это задачи, на которых было обнаружено отрицательное влияние рекурсии?<br>
1. Более чем классическая задача - поиск всех файлов в файловой системе (в каталоге + подкаталогах) по маске.<br>
Алгоритм с рекурсией есть даже в Википедии (вроде как).<br>
2. Задача поиска векторного минимакса в математическом программировании.<br>
Думаю, что если копнуть поглубже, то в математическом и в целочисленном программировании полно задач использует рекурсию - программы писать проще.<br>
Но вот если отказаться от рекурсии, попотеть над программой, то быстродействие вырастет минимум в 3 раза.<br>
<br>
P.S. Конечно, когда в файловой системе по маске ищутся несколько десятков файлов, отказ от рекурсии не заметен - поиск идет &quot;мгновенно&quot;.<br>
Но ситуация резко меняется, когда в поиске по маске находятся десятки и сотни тысяч файлов...<br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Эта тема была разделена из темы &quot;<a class='tag-url' href='https://forum.sources.ru/index.php?showtopic=427672' target='_blank'>Поиск по заданному полю большой структуры</a>&quot;</span></span>]]></description>
        <author>mkudritsky</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	