<?xml version="1.0" encoding="utf-8"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Форум программистов и сисадминов Киберфорум - Блоги - bedvit</title>
		<link>https://www.cyberforum.ru/blogs/829006/</link>
		<description>КиберФорум - форум программистов, системных администраторов, администраторов баз данных, компьютерный форум, форум по электронике и бытовой технике, обсуждение софта. Бесплатная помощь в решении задач по программированию и наукам, решение проблем с компьютером, операционными системам</description>
		<language>ru</language>
		<lastBuildDate>Sat, 22 Aug 2026 04:25:39 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>60</ttl>
		<image>
			<url>https://www.cyberforum.ru//cyberstatic.net/images/misc/rss.jpg</url>
			<title>Форум программистов и сисадминов Киберфорум - Блоги - bedvit</title>
			<link>https://www.cyberforum.ru/blogs/829006/</link>
		</image>
		<item>
			<title>Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT</title>
			<link>https://www.cyberforum.ru/blogs/829006/10733.html</link>
			<pubDate>Wed, 28 Jan 2026 09:35:05 GMT</pubDate>
			<description>*Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в...</description>
			<content:encoded><![CDATA[<div><b>Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.</b><br />
Часть библиотеки <a rel="nofollow noopener noreferrer" href="https://bedvit.ru/com/" target="_blank" title="https://bedvit.ru/com/">BedvitCOM</a><br />
Использованы исходники <a rel="nofollow noopener noreferrer" href="https://www.cryptopp.com/wiki/Main_Page" target="_blank" title="https://www.cryptopp.com/wiki/Main_Page">Crypto++</a><br />
Использованы <a rel="nofollow noopener noreferrer" href="https://learn.microsoft.com/ru-ru/windows/win32/cmpapi/using-the-compression-api" target="_blank" title="https://learn.microsoft.com/ru-ru/windows/win32/cmpapi/using-the-compression-api">алгоритмы сжатия</a> WinApi.<br />
<br />
<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=11456&amp;d=1769592533" rel="Lightbox" id="attachment11456" ><img src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=11456&amp;thumb=1&amp;d=1769592533" class="thumbnail" border="0" alt="Нажмите на изображение для увеличения
Название: VariantToFromFile.PNG
Просмотров: 367
Размер:	89.3 Кб
ID:	11456" style="margin: 5px" /></a><br />
<br />
<b>Функционал:</b><br />
+ Сохранять данные из VARIANT в файл<br />
+ Загружать данные из файла в VARIANT<br />
+ Шифровать данные при сохранении<br />
+ Сжимать/архивировать данные при сохранении<br />
+ Обрабатывать любое количество вложений в массивах (дерево)<br />
+ Реализован механизм (<a rel="nofollow noopener noreferrer" href="https://learn.microsoft.com/en-us/office/open-xml/spreadsheet/working-with-the-shared-string-table?tabs=cs" target="_blank" title="https://learn.microsoft.com/en-us/office/open-xml/spreadsheet/working-with-the-shared-string-table?tabs=cs">shared string table</a>), как в Excel, для оптимизации размера одинаковых строк при сохранении в файл<br />
<br />
 <br />
<b>Особенности:</b><br />
<b>! Алгоритмы компрессии <a rel="nofollow noopener noreferrer" href="https://learn.microsoft.com/en-us/windows/win32/api/compressapi/nf-compressapi-createcompressor" target="_blank" title="https://learn.microsoft.com/en-us/windows/win32/api/compressapi/nf-compressapi-createcompressor">compressapi.h</a> WinApi. поддерживаются начина с Windows 8 (Minimum supported client Windows 8).</b><br />
+ Поддерживаются базовые типы и массивы любой вложенности (только одномерные или двухмерный массивы). Объекты не сериализуются.<br />
+ Ссылочный тип VARIANT (VT_VARIANT | VT_BYREF) преобразуется в VARIANT при записи в файл.<br />
+ Пустая строка записывается в файл и читается из файла с NULL указателем в VARIANT (важная особенность BSTR заключается в том, что BSTR со значением NULL (или nullptr ) эквивалентен пустой строке . Другими словами, пустая строка &quot;&quot; и BSTR со значением NULL должны иметь одинаковую семантику).<br />
+ Поддерживает длинные пути к файлам<br />
+ Пароль хранится только во время выполнения в <a rel="nofollow noopener noreferrer" href="https://learn.microsoft.com/en-us/windows/win32/api/dpapi/nf-dpapi-cryptprotectmemory" target="_blank" title="https://learn.microsoft.com/en-us/windows/win32/api/dpapi/nf-dpapi-cryptprotectmemory">CryptProtectMemory</a>, при выполнении функции данные в CryptProtectMemory и параметре <i>password </i>затираются <a rel="nofollow noopener noreferrer" href="https://learn.microsoft.com/en-us/previous-versions/windows/desktop/legacy/aa366877(v=vs.85)" target="_blank" title="https://learn.microsoft.com/en-us/previous-versions/windows/desktop/legacy/aa366877(v=vs.85)">SecureZeroMemory</a>, т.е. информация о пароле стирается и далее его знает только пользователь, т.е. способа узнать забытый пароль не существует. <br />
+ Тип данных и алгоритм шифрования запоминается при сохранении в файле, и их нужно указывать только при сохранении в параметрах или в форме. При чтении файла нужен только пароль.<br />
+ Данные в файле хранятся в бинарном виде<br />
+ Поддержка 2х режимов: интерактивного и не интерактивного. Если вторым аргументом функции передаем пустую строку (полный путь к файлу) - работаем в интерактивном режиме (открываем форму, выводим ошибки в диалоге)<br />
<br />
<br />
<b>Функция сохранение в файл:</b><br />
VARIANT* resultRetval = <b>VariantToFile</b>(VARIANT* variantIn, BSTR fileName, BSTR fileNameDefault, BSTR password, LONG algorithmCrypto, LONG algorithmCompress, LONGLONG hWndParent)<br />
<br />
<br />
<b>Параметры функции:</b><br />
1. <i>variantIn </i>- данные в виде VARIANT для сохранения<br />
2. <i>fileName </i>- полный путь к файлу (если пустой - интерактивный режим)<br />
3. <i>fileNameDefault </i>- полный путь по умолчанию (открыть форму сохранения в этой папке с этим файлом в строке сохранения) , (не обязательный, по умолчанию: &quot;&quot;)<br />
4. <i>password </i>- пароль (не обязательный, по умолчанию: &quot;&quot;)<br />
5. <i>algorithmCrypto </i>- алгоритмы шифрования AES (не обязательный, по умолчанию: 1):<br />
    1 - &quot;Без шифрования&quot;<br />
    2 - &quot;AES256:ECB&quot;<br />
    3 - &quot;AES256:CBC&quot;<br />
    4 - &quot;AES256:OFB&quot;<br />
    5 - &quot;AES256:CFB&quot;<br />
    6 - &quot;AES256:CBC-CTS&quot;<br />
    7 - &quot;AES256:CTR&quot;<br />
6. <i>algorithmCompress </i>- алгоритмы сжатия (не обязательный, по умолчанию: 4)::<br />
    1 - &quot;Без сжатия&quot;<br />
    2 - &quot;WinAPI:MSZIP&quot;<br />
    3 - &quot;WinAPI:XPRESS&quot;<br />
    4 - &quot;WinAPI:XPRESS_HUFF*&quot;<br />
    5 - &quot;WinAPI:LZMS&quot;<br />
7. <i>hWndParent </i>- HWND окна родителя (не обязательный, по умолчанию: 0):.<br />
<br />
<br />
<b>Возвращаемые значения:</b><br />
resultRetval = S_OK(0): Успех<br />
resultRetval = ERROR_CANCELLED(1223): Операция была отменена пользователем.<br />
<i>Остальные ошибки выбрасываются исключениями.</i><br />
<br />
<br />
<br />
<b>Функция загрузки из файла::</b><br />
VARIANT* resultRetval = <b>VariantFromFile</b>(VARIANT* variantOut, BSTR fileName, BSTR fileNameBasic, BSTR password, LONGLONG hWndParent)<br />
<b>Параметры функции:</b><br />
1. <i>variantOut </i>- переменная VARIANT для получения данных из файла<br />
2. <i>fileName </i>- полный путь к файлу (если пустой - интерактивный режим)<br />
3. <i>fileNameBasic </i>- полный путь по умолчанию (открыть форму загрузки в этой папке с этим файлом в строке сохранения) , (не обязательный, по умолчанию: &quot;&quot;)<br />
4. <i>password </i>- пароль (не обязательный, по умолчанию: &quot;&quot;)<br />
5. <i>hWndParent </i>- HWND окна родителя (не обязательный, по умолчанию: 0)<br />
<br />
<br />
<b>Возвращаемые значения:</b><br />
resultRetval = S_OK(0): Успех<br />
resultRetval = ERROR_CANCELLED(1223): Операция была отменена пользователем.<br />
resultRetval = ERROR_USER_PROFILE_LOAD(500): Пользовательские данные из файла не удалось загрузить, создан новый файл (когда пути к fileName и fileNameBasic совпадают и файл с ошибкой). В интерактивном режиме выводятся имена созданного файла и файла отмеченного как ошибочного.<br />
resultRetval = NTE_BAD_KEYSET(2148073494): Часть ключей не загрузилась из файла. В интерактивном режиме выводится список.<br />
<i>Остальные ошибки выбрасываются исключениями.</i><br />
<br />
<div class="codeblock"><table class="vb"><thead><tr><td colspan="2" id="507873801"  class="head">Visual Basic</td></tr></thead><tbody><tr class="li1"><td><div id="507873801" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
</pre></td><td class="de1"><pre class="de1"><span class="kw2">Option</span> <span class="kw2">Explicit</span>
&nbsp;
<span class="kw2">Sub</span> Test_VariantToFromFile()
&nbsp;
&nbsp; &nbsp; <span class="kw4">Dim</span> listViewSave, listViewLoad, resultVtoF, resultVfromF, aray2D
&nbsp; &nbsp; <span class="kw4">Dim</span> aray2DHeader: <span class="kw4">ReDim</span> aray2DHeader(1 <span class="kw3">To</span> 2, 1 <span class="kw3">To</span> 2)
&nbsp; &nbsp; <span class="kw4">Dim</span> aray2DData: <span class="kw4">ReDim</span> aray2DData(1 <span class="kw3">To</span> 2, 1 <span class="kw3">To</span> 3)
&nbsp; &nbsp; <span class="kw4">Dim</span> bVBA <span class="kw4">As</span> <span class="kw1">Object</span>: <span class="kw4">Set</span> bVBA = <span class="kw2">CreateObject</span>(<span class="st0">&quot;BedvitCOM.VBA&quot;</span>) <span class="co1">'позднее связывание</span>
 &nbsp; &nbsp;
&nbsp; &nbsp; <span class="co1">'сохраним массив и описания к нему (дерево свойств объекта)</span>
 &nbsp; &nbsp;listViewSave = Array(<span class="st0">&quot;ListView309&quot;</span> _
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; , Array(<span class="st0">&quot;Header&quot;</span> _
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; , aray2DHeader) _
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; , Array(Array(<span class="st0">&quot;Data&quot;</span>, Array(1, 2)) _
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; , aray2DData) _
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; , Array(<span class="st0">&quot;Width&quot;</span> _
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; , Array(150, , 160)) _
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; , Array(<span class="st0">&quot;ComboBox&quot;</span> _
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; , Array(Array(, 111), , Array(222)) _
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; , Array(111, Array(<span class="st0">&quot;&quot;</span>, <span class="st0">&quot;(&quot;</span>, <span class="st0">&quot;((&quot;</span>, <span class="st0">&quot;(((&quot;</span>, <span class="st0">&quot;((((&quot;</span>, <span class="st0">&quot;(((((&quot;</span>)) _
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; , Array(222, Array(<span class="st0">&quot;&quot;</span>, <span class="st0">&quot;)&quot;</span>, <span class="st0">&quot;))&quot;</span>, <span class="st0">&quot;)))&quot;</span>, <span class="st0">&quot;))))&quot;</span>, <span class="st0">&quot;)))))&quot;</span>)) _
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ) _
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; , Array(<span class="st0">&quot;RC&quot;</span> _
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; , Array(Array(196, 197), , 198) _
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; , Array(197, <span class="st0">&quot;строка-бинарные данные ресурса&quot;</span>) _
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ) _
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; )
&nbsp; &nbsp; 
&nbsp; &nbsp; <span class="co1">'сохраняем в файл</span>
 &nbsp; &nbsp;<span class="co1">'если вторым аргументом передаем пустую строку(полный путь к файлу) - работаем в интерактивном режиме (открываем форму)</span>
 &nbsp; &nbsp;resultVtoF = bVBA.VariantToFile(listViewSave, <span class="st0">&quot;&quot;</span>)
&nbsp; &nbsp; <span class="kw3">If</span> resultVtoF = 1223 <span class="kw3">Then</span> <span class="kw2">Exit</span> <span class="kw2">Sub</span> <span class="co1">'отменено пользователем</span>
 &nbsp; &nbsp;
&nbsp; &nbsp; <span class="co1">'загружаем из файла</span>
 &nbsp; &nbsp;<span class="co1">'если вторым аргументом передаем пустую строку(полный путь к файлу) - работаем в интерактивном режиме (открываем форму)</span>
 &nbsp; &nbsp;resultVfromF = bVBA.VariantFromFile(listViewLoad, <span class="st0">&quot;&quot;</span>)
&nbsp; &nbsp; <span class="kw3">If</span> resultVtoF = 1223 <span class="kw3">Then</span> <span class="kw2">Exit</span> <span class="kw2">Sub</span> <span class="co1">'отменено пользователем</span>
&nbsp;
<span class="kw3">End</span> <span class="kw2">Sub</span></pre></td></tr></table></div></td></tr></tbody></table></div><br />
Библиотеки бесплатные, скачать можно <a rel="nofollow noopener noreferrer" href="https://bedvit.ru/xll/" target="_blank" title="https://bedvit.ru/xll/">здесь</a> (для Excel) или <a rel="nofollow noopener noreferrer" href="https://bedvit.ru/com/" target="_blank" title="https://bedvit.ru/com/">здесь</a> (для других программ).</div>

]]></content:encoded>
			<dc:creator>bedvit</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/829006/10733.html</guid>
		</item>
		<item>
			<title>Шифрование данных на листе Excel, в XLL, в COM (на примере VBA)</title>
			<link>https://www.cyberforum.ru/blogs/829006/8405.html</link>
			<pubDate>Thu, 25 Jan 2024 14:26:58 GMT</pubDate>
			<description>*Шифрование данных алгоритмами AES на листе Excel, шифрования файла пользовательских сохранений...</description>
			<content:encoded><![CDATA[<div><b>Шифрование данных алгоритмами AES на листе Excel, шифрования файла пользовательских сохранений XLL, хранение зашифрованных диапазонов формул/данных с листа Excel в файле пользовательских сохранений XLL</b><br />
Часть библиотеки <a href="https://www.cyberforum.ru/blogs/829006/blog5958.html">BedvitXLL</a><br />
Использованы исходники <a rel="nofollow noopener noreferrer" href="https://www.cryptopp.com/wiki/Main_Page" target="_blank" title="https://www.cryptopp.com/wiki/Main_Page">Crypto++</a><br />
Расширенный пример см. <a rel="nofollow noopener noreferrer" href="https://bedvit.ru/xll/crypto/" target="_blank" title="https://bedvit.ru/xll/crypto/">на сайте bedvit.ru</a><br />
<br />
<br />
<b>Алгоритмы шифрования AES:<br />
<br />
    1 - &quot;Без шифрования&quot;<br />
    2 - &quot;AES256:ECB&quot;<br />
    3 - &quot;AES256:CBC&quot;<br />
    4 - &quot;AES256:OFB&quot;<br />
    5 - &quot;AES256:CFB&quot;<br />
    6 - &quot;AES256:CBC-CTS&quot;<br />
    7 - &quot;AES256:CTR&quot;</b><br />
<br />
<br />
<br />
<b>Шифрование на листе Excel и хранение данный в XLL:</b><br />
<b>Функционал:</b><br />
+ Можно шифровать как отдельные значения так и диапазоны/массивы.<br />
+ Шифровать можно на листе, шифровать можно сохраняемые диапазоны и шифровать можно и файл пользовательских сохранений.<br />
+ Шифровать данные можно прям на листе Excel, с дальнейшей расшифровкой нужного диапазона или всего листа в виде значений (value2), так и в виде формул (formula).<br />
+ Зашифрованные данные можно хранить в XLL как в виде значений (value2), так и в виде формул (formula). Формула может содержать максимум 8 тыс. символов<br />
+ Пароль нигде не хранится, его знает только пользователь и при утере, расшифровать данные не получится никому <br />
+ Тип данных и алгоритм шифрования запоминается при зашифровки, и их нужно указывать только при шифровании. При расшифровки нужен только 1 пароль (повтор пароля нужен только для шифрования, для расшифровки достаточно одного-первого)<br />
+ Зашифрованные диапазоны - независимые, т.е. можно каждый отдельный диапазон зашифровать со своим паролем, можно зашифровать диапазон дважды (для гиков)<br />
+ Реализовано автоматическое распознавание разных блоков зашифрованных диапазонов, с разными алгоритмами и их расшифровка разом (см. видео), но должен быть одинаковый пароль для случаев пакетной распаковки (сразу всего листа)<br />
+ Для данных у которых упаковка будет экономить размер итоговой зашифрованной строки (для массивов и длинных строк)  - используется алгоритм сжатия <a rel="nofollow noopener noreferrer" href="https://learn.microsoft.com/ru-ru/windows/win32/cmpapi/using-the-compression-api" target="_blank" title="https://learn.microsoft.com/ru-ru/windows/win32/cmpapi/using-the-compression-api">WinAPI:XPRESS_HUFF</a><br />
+ Реализован механизм (<a rel="nofollow noopener noreferrer" href="https://learn.microsoft.com/en-us/office/open-xml/spreadsheet/working-with-the-shared-string-table?tabs=cs" target="_blank" title="https://learn.microsoft.com/en-us/office/open-xml/spreadsheet/working-with-the-shared-string-table?tabs=cs">shared string table</a>), как и в Excel, для оптимизации размера одинаковых строк (для массивов), см. особенности ниже.<br />
+ Данные на листе Excel шифруются для каждой ячейки отдельно (для возможности хранить и расшифровывать данные независимо для каждой ячейки)<br />
+ Итоговый результат шифрования (любого типа данных: строки, числа, ошибки и т.д.) - хранится в виде строки (массива зашифрованных байт).<br />
+ Для каждой команды есть всплывающие подсказки<br />
 <br />
 <br />
<b>Особенности:</b><br />
+ Сохранять диапазон в списке диапазонов можно в зашифрованном виде или не в зашифрованном (в незашифрованном эффективнее сжимаются сохранения т.к. обрабатываются все дубликаты во всех сохранённых диапазонах, а не частично в отдельном диапазоне), но можно шифровать сам файл пользовательских настроек - эффективность сжатия сохраняется.<br />
+ есть возможность автоматически определять границы диапазона, выделяя весь лист или целый столбец или целую строку, см. usedrange<br />
+ добавлена возможность выключать пользовательские сообщения и сообщения в статус-баре Excel<br />
<br />
 <br />
<a rel="nofollow noopener noreferrer" href="https://bedvit.ru/gallery/00003TestVariantDecrypt3.mp4" target="_blank" title="https://bedvit.ru/gallery/00003TestVariantDecrypt3.mp4"><b>Пример использования в Excel (видео)</b></a><br />
<img src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=8462&amp;st= c=1&amp;d=1706194017" border="0" alt="" style="max-width: 800px; margin: 5px 0px 5px 0px;" /><br />
<br />
<br />
<br />
<b>Шифрование данных VBA:<br />
Функции:</b><br />
1. VARIANT stringProtect = <b>VariantAES256Encrypt</b>(VARIANT variantIn, BSTR password, VARIANT_BOOL secureZeroMemoryPassword, BSTR salt, LONG algorithmCrypto)<br />
2. VARIANT variantUnProtect = <b>VariantAES256Decrypt</b>(VARIANT byteArrayIn, BSTR password, VARIANT_BOOL secureZeroMemoryPassword, BSTR salt, LONG algorithmCrypto)<br />
 <br />
<br />
<b>Параметры функции:</b><br />
1. <i>variantIn </i>- входящий массив или отдельное значение<br />
1. <i>byteArrayIn </i>- входящий байтовый массив(строка) для расшифровки<br />
2. <i>password </i>- пароль<br />
3. <i>secureZeroMemoryPassword </i>- безопасное обнуление значения пароля<br />
4. <i>salt </i>- соль (к паролю)<br />
5. <i>algorithmCrypto</i>- алгоритмы шифрования AES:<br />
    1 - &quot;Без шифрования&quot;<br />
    2 - &quot;AES256:ECB&quot;<br />
    3 - &quot;AES256:CBC&quot;<br />
    4 - &quot;AES256:OFB&quot;<br />
    5 - &quot;AES256:CFB&quot;<br />
    6 - &quot;AES256:CBC-CTS&quot;<br />
    7 - &quot;AES256:CTR&quot;<br />
<br />
<br />
<i>stringProtect/variantUnProtect </i> - получаемый результат: зашифрованная строка или первоначальный VARIANT<br />
<br />
 <br />
<a rel="nofollow noopener noreferrer" href="https://bedvit.ru/gallery/00001TestVariantDecrypt.mp4" target="_blank" title="https://bedvit.ru/gallery/00001TestVariantDecrypt.mp4"><b>Пример использования в VBA (видео)</b></a><br />
<img src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=8463&amp;st= c=1&amp;d=1706194258" border="0" alt="" style="max-width: 800px; margin: 5px 0px 5px 0px;" /></div>


<!-- attachments -->
	<div style="margin-top:10px">

		
			<fieldset class="fieldset">
				<legend>Миниатюры</legend>
				<div style="padding:3px">
				
	<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=8462&amp;d=1706194016" target="attachment" rel="Lightbox" id="attachment8462"><img loading="lazy" decoding="async" class="thumbnail" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=8462&amp;stc=1&amp;thumb=1&amp;d=1706194016" border="0" alt="Нажмите на изображение для увеличения
Название: 00001TestVariantDecrypt.PNG
Просмотров: 2572
Размер:	749.9 Кб
ID:	8462" /></a>
	&nbsp;
	

				</div>
			</fieldset>
		
		
		
			<fieldset class="fieldset">
				<legend>Изображения</legend>
				<table cellpadding="0" cellspacing="3" border="0">
				<tr>
	<td><img loading="lazy" decoding="async" class="inlineimg" src="http://www.cyberforum.ru//cyberstatic.net/images/attach/jpg.gif" alt="Тип файла: jpg" width="16" height="16" border="0" style="vertical-align:baseline" /></td>
	<td><a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=8463&amp;d=1706194257">00001TestVariantDecrypt2.jpg</a> (116.0 Кб, 2319 просмотров)</td>
</tr>
				</table>
				</fieldset>
		
		

	</div>
<!-- / attachments -->
]]></content:encoded>
			<dc:creator>bedvit</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/829006/8405.html</guid>
		</item>
		<item>
			<title>Variant Serialization and Deserialization</title>
			<link>https://www.cyberforum.ru/blogs/829006/8404.html</link>
			<pubDate>Thu, 25 Jan 2024 14:08:31 GMT</pubDate>
			<description>*Cериализация и десериализация типа данных Variant, используемый в COM, VB, VBA, C++, Python и...</description>
			<content:encoded><![CDATA[<div><b>Cериализация и десериализация типа данных Variant, используемый в COM, VB, VBA, C++, Python и других поддерживающих СОМ языков</b><br />
<br />
Реализация в СОМ. Реализация для XLL как функция COM.DLL<br />
Часть библиотеки <a href="https://www.cyberforum.ru/blogs/829006/blog5958.html">BedvitCOM</a><br />
Поддерживаются базовые типы и массивы. Объекты не сериализуются.<br />
В некоторой степени - аналог <a rel="nofollow noopener noreferrer" href="https://learn.microsoft.com/ru-ru/cpp/atl/reference/ccomvariant-class?view=msvc-170#readfromstream" target="_blank" title="https://learn.microsoft.com/ru-ru/cpp/atl/reference/ccomvariant-class?view=msvc-170#readfromstream">CComVariant::ReadFromStream и CComVariant::WriteToStream</a><br />
<br />
<br />
<b>Функции:</b><br />
VARIANT <b>byteArrayOutRetval </b>= VariantSerialization(VARIANT variantIn)<br />
<br />
VARIANT variantOut= <b>VariantDeserialization</b>(VARIANT byteArrayOutRetval)<br />
<br />
<b>Параметры функции:</b><br />
1. <i>variantIn/variantOut</i>- входящий/получаемый VARIANT - значение или массив значений<br />
2. <i>byteArrayOutRetval </i>- массив байтов<br />
<br />
 <br />
<br />
<b>Особенности:</b><br />
1. Cериализация в байтовый массив<br />
2. Размер массива не может превышать 2^32 элементов (около 4Гбайт). Это ограничение самого  COM - массива. В С++ (в другом контейнере) сохранял файлы боле 4,5 Гб.<br />
3. Реализован похожий механизм (<a rel="nofollow noopener noreferrer" href="https://learn.microsoft.com/en-us/office/open-xml/spreadsheet/working-with-the-shared-string-table?tabs=cs" target="_blank" title="https://learn.microsoft.com/en-us/office/open-xml/spreadsheet/working-with-the-shared-string-table?tabs=cs">shared string table</a>), как и в Excel, для оптимизации размера одинаковых строк.<br />
<br />
<br />
<b>Пример использования:</b><br />
<div class="codeblock"><table class="vb"><thead><tr><td colspan="2" id="761935664"  class="head">Visual Basic</td></tr></thead><tbody><tr class="li1"><td><div id="761935664" style="height: 286px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="de1"><pre class="de1"><span class="kw2">Sub</span> TestVariantSerialization() &nbsp; &nbsp; 
&nbsp;
&nbsp; &nbsp; <span class="co1">'Dim bVBA As New BedvitCOM.VBA 'раннее связывание &nbsp; &nbsp; </span>
 &nbsp; &nbsp;<span class="kw4">Dim</span> bVBA <span class="kw4">As</span> <span class="kw1">Object</span>: <span class="kw4">Set</span> bVBA = <span class="kw2">CreateObject</span>(<span class="st0">&quot;BedvitCOM.VBA&quot;</span>) <span class="co1">'позднее связывание &nbsp; &nbsp; </span>
 &nbsp; &nbsp;<span class="kw4">Dim</span> t, arr, byteArr &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; Range(<span class="st0">&quot;A:B&quot;</span>).value2 = <span class="st0">&quot;Tst Srl ёя&quot;</span> &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; 
&nbsp; &nbsp; t = Timer &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; byteArr = bVBA.VariantSerialization(Range(<span class="st0">&quot;A:B&quot;</span>).value2) &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; arr = bVBA.VariantDeserialization(byteArr) &nbsp; &nbsp; 
&nbsp; &nbsp; Debug.<span class="kw4">Print</span> <span class="st0">&quot;VariantSerialization+VariantDeserialization &quot;</span> &amp; Timer - t &amp; <span class="st0">&quot; s.&quot;</span> &nbsp; &nbsp; 
&nbsp;
&nbsp; &nbsp; Range(<span class="st0">&quot;D:E&quot;</span>).value2 = arr &nbsp; &nbsp; 
&nbsp;
<span class="kw3">End</span> <span class="kw2">Sub</span></pre></td></tr></table></div></td></tr></tbody></table></div></div>

]]></content:encoded>
			<dc:creator>bedvit</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/829006/8404.html</guid>
		</item>
		<item>
			<title>Фильтр одномерного и двухмерного СОМ-массива (VARIANT)</title>
			<link>https://www.cyberforum.ru/blogs/829006/7726.html</link>
			<pubDate>Sat, 15 Oct 2022 19:01:27 GMT</pubDate>
			<description>*Фильтр одномерного и двухмерного СОМ-массива (тип данных VARIANT) с любым количеством столбцов, с...</description>
			<content:encoded><![CDATA[<div><b>Фильтр одномерного и двухмерного СОМ-массива (тип данных VARIANT) с любым количеством столбцов, с любым количеством условий.</b><br />
<b>Реализован параллельный алгоритм фильтрации </b>(поддержка любого количества логических процессоров).<br />
Часть библиотеки <a href="https://www.cyberforum.ru/blogs/829006/blog5958.html">BedvitCOM</a> (начиная с v2.0.1.0, в XLL c v3.2.1.0)<br />
<br />
<b>ArrayFilterV(VARIANT* array_in, VARIANT* array_parameters, VARIANT_BOOL array_out_index, VARIANT* array_out)</b><br />
1. <b>array_in </b>- массив входящий (одномерный, двухмерный), тип данных VARIANT.<br />
2. <b>array_parameters </b>- массив задаваемых параметров, тип данных VARIANT (6 параметров для одного условия, можно для одного и того же столбца, можно для разных). Количество условий не ограничено. Условия можно создать из списка, можно создать двухмерный массив и заполнить, можно забрать сразу с листа Excel.<br />
3. <b>array_out_index </b>- режим вывода: 0- отфильтрованный массив, 1-массив индексов<br />
4. <b>array_out </b>- массив результатов<br />
<br />
Условия в массиве параметров применяются в порядке следования, если нет скобок или внутри скобок. Скобки задают приоритет выполнения условий (стандартно), потом &quot;И&quot; и &quot;ИЛИ&quot; в порядке очередности.<br />
Параметры массива условий (сделал максимально близко к стандартной записи условий) - 6 параметров для каждой строки условия:<br />
1.<i><b>Логические операторы</b></i> (0-ИЛИ, 1-И). Для первого условия можно не указывать.<br />
2.<i><b>Скобки открывающие</b></i> (если нужны, можно несколько)<br />
3.<i><b>Столбец для фильтрации</b></i><br />
4.<i><b>Операторы сравнения</b></i> (для сравнения значения заданного столбца со значением фильтра):<br />
<font color="Blue">    1 - меньше (для числа),<br />
    2 - равно (для числа и строки),<br />
    4 - больше (для числа),<br />
    8 - содержит подстроку (для строки),<br />
    16 - зарезервированное значение (регулярки),<br />
    32 - игнорировать регистр (для строки) ,<br />
    64 - зарезервированное значение (basic),  <br />
    128 - зарезервированное значение (extended),<br />
    256 - LIKE (пока только знак подстановки &quot;*&quot;)(для строки) (начиная с v3.5, в XLL c v4.6) полноценный <b><a rel="nofollow noopener noreferrer" href="https://learn.microsoft.com/ru-ru/office/vba/language/reference/user-interface-help/like-operator" target="_blank" title="https://learn.microsoft.com/ru-ru/office/vba/language/reference/user-interface-help/like-operator">Like </a></b>(бинарный режим)<br />
    512-НЕ (для числа и строки)</font><br />
    <b>Реализовано в виде бинарной маски</b>, т.е. можно складывать, к примеру 8+512 - НЕ содержит подстроку, 1+2 - меньше или равно и т.д.<br />
5.<i><b>Значение фильтра</b></i> (для фильтрации)<br />
6.<i><b>Скобки закрывающие</b></i> (если нужны, можно несколько)<br />
<br />
т.е. для каждого условия <b>6 параметров: И/ИЛИ,(((...,стобец, оператор сравнения, значение, ...)))</b><br />
<br />
Условия можно задавать как простые:<br />
'фильтр по первому столбцу, значение = 9<br />
<font color="Blue">Array(,,1, 2, 9, &quot;&quot;)</font><br />
<br />
так и более сложные, к примеру (см.рис.)<br />
<img src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=7734&amp;st= c=1&amp;d=1665859615" border="0" alt="" style="max-width: 800px; margin: 5px 0px 5px 0px;" /><br />
<font color="blue">Array(,&quot;(((&quot;, 1, Содержит, &quot;маша&quot;, , ИЛИ, , 1, Содержит, &quot;вася&quot;, &quot;)&quot;, И, , 1, НеРавно, &quot;маша иванова&quot;, &quot;)&quot;, ИЛИ, &quot;(&quot;, 2, НеРавно, &quot;'1&quot;, , ИЛИ, , 2, Равно, 1, &quot;))&quot;, И, &quot;(&quot;, 3, БольшеРавно, 12.5, , И, , 3, МеньшеРавно, 55.8, &quot;)&quot;)</font><br />
или в таком виде (как удобнее). В примере для операторов сравнения созданы псевдонимы (в виде слова, по факту это банарная маска, см. выше)<br />
<font color="blue">Array( _<br />
,&quot;(((&quot;, 1, Содержит, &quot;маша&quot;, , _<br />
ИЛИ, , 1, Содержит, &quot;вася&quot;, &quot;)&quot;, _<br />
И, , 1, НеРавно, &quot;маша иванова&quot;, &quot;)&quot;, _<br />
ИЛИ, &quot;(&quot;, 2, НеРавно, &quot;'1&quot;, , _<br />
ИЛИ, , 2, Равно, 1, &quot;))&quot;, _<br />
И, &quot;(&quot;, 3, БольшеРавно, 12.5, , _<br />
И, , 3, МеньшеРавно, 55.8, &quot;)&quot; _<br />
)</font><br />
<br />
<b>Тайминги: фильтрация 10 млн. строк с найденными 5 млн. = 0,2 секунды</b><br />
<br />
Простые примеры (с замером скорости на 10 млн строк) и сложные (с выводом условий и результата):<br />
<div class="codeblock"><table class="vb"><thead><tr><td colspan="2" id="320380166"  class="head">Visual Basic</td></tr></thead><tbody><tr class="li1"><td><div id="320380166" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
</pre></td><td class="de1"><pre class="de1"><span class="kw2">Option</span> <span class="kw2">Explicit</span>
<span class="co1">'операторы (aliases) псевдонимы</span>
Const ИЛИ = 0, И = 1, РАВНО = 2, СОДЕРЖИТ = 8, НЕРАВНО = 512 + 2, МЕНЬШЕРАВНО = 1 + 2, БОЛЬШЕРАВНО = 4 + 2, МЕНЬШЕ = 1, БОЛЬШЕ = 4
&nbsp;
<span class="co1">'ОДНОМЕРНЫЙ МАССИВ, ПРОСТЫЕ УСЛОВИЯ, бинарная маска без слова-псевдонима</span>
<span class="kw2">Sub</span> TestArrayFilterV_1()
&nbsp; &nbsp; <span class="co1">'Dim bVBA As New BedvitCOM.VBA 'раннее связывание</span>
 &nbsp; &nbsp;<span class="kw4">Dim</span> bVBA <span class="kw4">As</span> <span class="kw1">Object</span>: <span class="kw4">Set</span> bVBA = <span class="kw2">CreateObject</span>(<span class="st0">&quot;BedvitCOM.VBA&quot;</span>) <span class="co1">'позднее связывание</span>
 &nbsp; &nbsp;<span class="kw4">Dim</span> arrResult
&nbsp; &nbsp; <span class="co1">'первоначальный массив данных</span>
 &nbsp; &nbsp;<span class="kw4">Dim</span> arrV: arrV = Array(1, 0, 1, 0, 1, 0)
&nbsp; &nbsp; <span class="co1">'массив условий (фильтр по первому столбцу, значение = 1)</span>
 &nbsp; &nbsp;<span class="kw4">Dim</span> p: p = Array(, , 1, 2, 1, <span class="st0">&quot;&quot;</span>)
&nbsp;
&nbsp; &nbsp; <span class="co1">' фильтруем ===============================</span>
 &nbsp; &nbsp;bVBA.ArrayFilterV arrV, p, 0, arrResult
&nbsp; &nbsp; <span class="co1">'========================================</span>
 &nbsp; &nbsp;Debug.<span class="kw4">Print</span> <span class="kw4">UBound</span>(arrResult) + 1 <span class="co1">'начало с 0</span>
<span class="kw3">End</span> <span class="kw2">Sub</span>
&nbsp;
&nbsp;
&nbsp;
<span class="co1">'ДВУХМЕРНЫЙ МАССИВ, ПРОСТЫЕ УСЛОВИЯ, бинарная маска в виде слова-псевдонима</span>
<span class="kw2">Sub</span> TestArrayFilterV_2()
&nbsp; &nbsp; <span class="co1">'Dim bVBA As New BedvitCOM.VBA 'раннее связывание</span>
 &nbsp; &nbsp;<span class="kw4">Dim</span> bVBA <span class="kw4">As</span> <span class="kw1">Object</span>: <span class="kw4">Set</span> bVBA = <span class="kw2">CreateObject</span>(<span class="st0">&quot;BedvitCOM.VBA&quot;</span>) <span class="co1">'позднее связывание</span>
 &nbsp; &nbsp;<span class="kw4">Dim</span> arrResult, r, c, t, x
&nbsp; &nbsp; <span class="kw4">Dim</span> sizeRow <span class="kw4">As</span> <span class="kw1">Long</span>: sizeRow = 10000000
&nbsp; &nbsp; <span class="kw4">Dim</span> sizeCol <span class="kw4">As</span> <span class="kw1">Long</span>: sizeCol = 1
&nbsp; &nbsp; <span class="kw4">Dim</span> arrV: <span class="kw4">ReDim</span> arrV(1 <span class="kw3">To</span> sizeRow, 1 <span class="kw3">To</span> sizeCol) <span class="co1">'первоначальный массив данных, далее хаполняем рендомно</span>
 &nbsp; &nbsp; 
&nbsp; &nbsp; <span class="co1">'массив условий (фильтр по первому столбцу, значение = 1)</span>
 &nbsp; &nbsp;<span class="kw4">Dim</span> p: p = Array(, , 1, РАВНО, 1, <span class="st0">&quot;&quot;</span>)
&nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; <span class="co1">'заполняем первоначальный массив с данными</span>
 &nbsp; &nbsp;<span class="kw3">For</span> r = 1 <span class="kw3">To</span> sizeRow
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">For</span> c = 1 <span class="kw3">To</span> sizeCol
&nbsp; &nbsp; &nbsp; &nbsp; arrV(r, c) = CLng(Rnd * 2)
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">Next</span>
&nbsp; &nbsp; <span class="kw3">Next</span>
&nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; t = Timer
&nbsp; &nbsp; <span class="co1">' фильтруем ===============================</span>
 &nbsp; &nbsp;bVBA.ArrayFilterV arrV, p, 0, arrResult
&nbsp; &nbsp; <span class="co1">'========================================</span>
 &nbsp; &nbsp;Debug.<span class="kw4">Print</span> Timer - t
&nbsp; &nbsp; Debug.<span class="kw4">Print</span> <span class="kw4">UBound</span>(arrResult) + 1 <span class="co1">'начало с 0</span>
<span class="kw3">End</span> <span class="kw2">Sub</span>
&nbsp;
&nbsp;
&nbsp;
<span class="co1">'ДВУХМЕРНЫЙ МАССИВ, СЛОЖНЫЕ УСЛОВИЯ, бинарная маска в виде слова-псевдонима</span>
<span class="kw2">Sub</span> TestArrayFilterV_3()
&nbsp;
<span class="kw4">Dim</span> arrParam, arrTest, arrRes, bCOMvba <span class="kw4">As</span> <span class="kw1">Object</span>: <span class="kw4">Set</span> bCOMvba = <span class="kw2">CreateObject</span>(<span class="st0">&quot;BedvitCOM.VBA&quot;</span>)
&nbsp;
Cells.ClearContents
&nbsp;
<span class="co1">'создаем тестовый массив</span>
arrTest = Array(<span class="st0">&quot;маша иванова&quot;</span>, <span class="st0">&quot;'1&quot;</span>, 13, <span class="st0">&quot;маша иванова&quot;</span>, 1, 13, <span class="st0">&quot;маша&quot;</span>, <span class="st0">&quot;'1&quot;</span>, 14, <span class="st0">&quot;вася&quot;</span>, <span class="st0">&quot;'1&quot;</span>, 14, <span class="st0">&quot;паша&quot;</span>, 1, 50, <span class="st0">&quot;вася&quot;</span>, 2, 52, <span class="st0">&quot;маша&quot;</span>, 1, 60, <span class="st0">&quot;вася&quot;</span>, 1, 65)
bCOMvba.Array1Dto2D arrTest, 1, 1, <span class="kw4">UBound</span>(arrTest) / 3: bCOMvba.Transpose arrTest
Cells(1, 1).Resize(<span class="kw4">UBound</span>(arrTest, 1), <span class="kw4">UBound</span>(arrTest, 2)) = arrTest
&nbsp;
<span class="co1">'запись условий для фильтра:(((c1 like &quot;маша&quot; or like &quot;вася&quot;) and c1&lt;&gt;&quot;маша иванова&quot;) or (c2&lt;&gt;&quot;1&quot; or c2=1)) and (c3&gt;=12,5 and c3&lt;=55,8)</span>
arrParam = Array(, <span class="st0">&quot;(((&quot;</span>, 1, СОДЕРЖИТ, <span class="st0">&quot;маша&quot;</span>, , ИЛИ, , 1, СОДЕРЖИТ, <span class="st0">&quot;вася&quot;</span>, <span class="st0">&quot;)&quot;</span>, И, , 1, НЕРАВНО, <span class="st0">&quot;маша иванова&quot;</span>, <span class="st0">&quot;)&quot;</span>, ИЛИ, <span class="st0">&quot;(&quot;</span>, 2, НЕРАВНО, <span class="st0">&quot;'1&quot;</span>, , ИЛИ, , 2, РАВНО, 1, <span class="st0">&quot;))&quot;</span>, И, <span class="st0">&quot;(&quot;</span>, 3, БОЛЬШЕРАВНО, 12.5, , И, , 3, МЕНЬШЕРАВНО, 55.8, <span class="st0">&quot;)&quot;</span>)
<span class="co1">'ИЛИ ТАК</span>
arrParam = Array( _
, <span class="st0">&quot;(((&quot;</span>, 1, СОДЕРЖИТ, <span class="st0">&quot;маша&quot;</span>, , _
ИЛИ, , 1, СОДЕРЖИТ, <span class="st0">&quot;вася&quot;</span>, <span class="st0">&quot;)&quot;</span>, _
И, , 1, НЕРАВНО, <span class="st0">&quot;маша иванова&quot;</span>, <span class="st0">&quot;)&quot;</span>, _
ИЛИ, <span class="st0">&quot;(&quot;</span>, 2, НЕРАВНО, <span class="st0">&quot;'1&quot;</span>, , _
ИЛИ, , 2, РАВНО, 1, <span class="st0">&quot;))&quot;</span>, _
И, <span class="st0">&quot;(&quot;</span>, 3, БОЛЬШЕРАВНО, 12.5, , _
И, , 3, МЕНЬШЕРАВНО, 55.8, <span class="st0">&quot;)&quot;</span> _
)
bCOMvba.Array1Dto2D arrParam, 1, 1, <span class="kw4">UBound</span>(arrParam) / 6: bCOMvba.Transpose arrParam
Cells(1, 5).Resize(<span class="kw4">UBound</span>(arrParam, 1), <span class="kw4">UBound</span>(arrParam, 2)) = arrParam
&nbsp;
<span class="co1">'применяем фильтр</span>
bCOMvba.ArrayFilterV arrTest, arrParam, 0, arrRes
Cells(1, 12).Resize(<span class="kw4">UBound</span>(arrRes, 1), <span class="kw4">UBound</span>(arrRes, 2)) = arrRes
&nbsp;
<span class="kw3">End</span> <span class="kw2">Sub</span></pre></td></tr></table></div></td></tr></tbody></table></div></div>


<!-- attachments -->
	<div style="margin-top:10px">

		
			<fieldset class="fieldset">
				<legend>Миниатюры</legend>
				<div style="padding:3px">
				
	<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=7734&amp;d=1665859208" target="attachment" rel="Lightbox" id="attachment7734"><img loading="lazy" decoding="async" class="thumbnail" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=7734&amp;stc=1&amp;thumb=1&amp;d=1665859208" border="0" alt="Нажмите на изображение для увеличения
Название: s014ArrayFilterV.png
Просмотров: 996
Размер:	134.2 Кб
ID:	7734" /></a>
	&nbsp;
	

				</div>
			</fieldset>
		
		
		
		

	</div>
<!-- / attachments -->
]]></content:encoded>
			<dc:creator>bedvit</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/829006/7726.html</guid>
		</item>
		<item>
			<title>XLL хранение и выполнение VBA кода, или защита VBA кода от просмотра? (C/C++)</title>
			<link>https://www.cyberforum.ru/blogs/829006/7496.html</link>
			<pubDate>Sun, 10 Apr 2022 14:51:18 GMT</pubDate>
			<description>Инструмент позволяющий хранить VBA код в XLL и его выполнять. 
Часть библиотеки BedvitXLL...</description>
			<content:encoded><![CDATA[<div>Инструмент позволяющий хранить VBA код в XLL и его выполнять.<br />
Часть библиотеки <a href="https://www.cyberforum.ru/blogs/829006/blog5958.html">BedvitXLL</a><br />
Как работает: Сохраняем VBA-код в форме (см.скрин), делимся сохранением .bin с коллегами, заказчиками и т.д. (у них тоже должна стоять .xll). Они смогут использовать весь функционал, но не смогут посмотреть код без пароля.<br />
<br />
Особенности:<br />
+Загружаем код - с Option Explicit и другими операторами (загружаем весь модуль VBA)<br />
+Код можно запускать прямо с главной панели (выбрав из списка нужный) или из формы загрузки<br />
+Можно задавать пароль на просмотр (по умолчанию это слово &quot;Пароль&quot;)<br />
+Можно смотреть VBA-код, если знаешь пароль.<br />
+Можно выполнять VBA-код, даже если не знаешь пароль.<br />
+Код хранится зашифрованный в файле сохранения настроек библиотеки (BedvitXLL.bin).<br />
+Пароль не хранится, а хранится его хеш<br />
+VBA-код может загрузить любой пользователь и любой пользователь его использовать, при условии включенного доступа к объектной модели проектов VBA.<br />
-пока работает только один модуль VBA<br />
-выполняется только Sub() без аргументов, или с аргументами по умолчанию в качестве стартовой процедуры. В самом коде нет ограничений. Просто вызов с кнопки, аргументы сейчас не передаются. Но доработать можно при наличии интереса.<br />
-нельзя использовать Function(), другими словами UDF.<br />
-сейчас функционал скромный, обрисовал только концепцию.<br />
-кнопка &quot;сохранить в файл&quot;, &quot;вывести в окно&quot; для сохранения кода в формате С++(доп.функционал для автора, для пользователя не нужная)<br />
<br />
<a rel="nofollow noopener noreferrer" href="http://bedvit.ru/xll/" target="_blank" title="http://bedvit.ru/xll/">BedvitXLL(v3.0.0.0) и выше</a></div>


<!-- attachments -->
	<div style="margin-top:10px">

		
			<fieldset class="fieldset">
				<legend>Миниатюры</legend>
				<div style="padding:3px">
				
	<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=7438&amp;d=1649601989" target="attachment" rel="Lightbox" id="attachment7438"><img loading="lazy" decoding="async" class="thumbnail" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=7438&amp;stc=1&amp;thumb=1&amp;d=1649601989" border="0" alt="Нажмите на изображение для увеличения
Название: VBAStorage2.PNG
Просмотров: 691
Размер:	57.8 Кб
ID:	7438" /></a>
	&nbsp;
	

	<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=7439&amp;d=1649602230" target="attachment" rel="Lightbox" id="attachment7439"><img loading="lazy" decoding="async" class="thumbnail" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=7439&amp;stc=1&amp;thumb=1&amp;d=1649602230" border="0" alt="Нажмите на изображение для увеличения
Название: VBAStorage3.PNG
Просмотров: 628
Размер:	32.5 Кб
ID:	7439" /></a>
	&nbsp;
	

	<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=7440&amp;d=1649602230" target="attachment" rel="Lightbox" id="attachment7440"><img loading="lazy" decoding="async" class="thumbnail" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=7440&amp;stc=1&amp;thumb=1&amp;d=1649602230" border="0" alt="Нажмите на изображение для увеличения
Название: VBAStorage4.PNG
Просмотров: 522
Размер:	62.1 Кб
ID:	7440" /></a>
	&nbsp;
	
		<br /><br />
	

				</div>
			</fieldset>
		
		
		
		

	</div>
<!-- / attachments -->
]]></content:encoded>
			<dc:creator>bedvit</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/829006/7496.html</guid>
		</item>
		<item>
			<title>Быстрое преобразование размерности массива в COM без потери данных.</title>
			<link>https://www.cyberforum.ru/blogs/829006/7235.html</link>
			<pubDate>Wed, 11 Aug 2021 10:30:16 GMT</pubDate>
			<description>*Быстрое преобразование массива в СОМ - из одномерного в двухмерный и наоборот (с сохранением...</description>
			<content:encoded><![CDATA[<div><b>Быстрое преобразование массива в СОМ - из одномерного в двухмерный и наоборот (с сохранением данных)</b><br />
Часть библиотеки <a href="https://www.cyberforum.ru/blogs/829006/blog5958.html">BedvitCOM</a> (начиная с v1.0.5.0, в XLL c v2.0.1.9)<br />
<br />
<b>Функции:</b><br />
<font color="Blue"><b>1.Array2Dto1D() </b></font>- быстрое преобразования двухмерного массива в одномерный (данные не обрезаются, 2е измерение преобразуются в очередь - складывается &quot;столбцами&quot;)<br />
Параметры функции:<br />
1.<b>array_in_out</b> - массив, который нужно преобразовать<br />
2.<b>lLbound</b> - нижняя граница нового массива (по умолчанию=0)<br />
<br />
<font color="blue"><b>2.Array1Dto2D()</b> </font>- быстрое преобразование одномерного массива в двухмерный (данные не удаляются). <b>Начиная с v2.0.0.2 можно задавать размер первой размерности, вторая рассчитывается автоматически</b>, в зависимости от общего количества элементов. Размер для размерности должен задаваться так, что бы общее количество элементов массива было кратно задаваемому размеру. Порядок данных сохраняется первоначальный.<br />
Параметры функции:<br />
1.<b>array_in_out</b> - массив, который нужно преобразовать<br />
2.<b>lLboundCol</b> - нижняя граница нового массива, 1е измерение - столбцы (по умолчанию=0)<br />
3.<b>lLboundRow</b> - нижняя граница нового массива, 2е измерение - строки(по умолчанию=0)<br />
4.<b>cElementsCol</b> - размер для первой размерности, кол-во столбцов (по умолчанию=1)<b>(начиная с v2.0.0.2)</b><br />
<br />
Пример использования в VBA (Excel):<br />
<div class="codeblock"><table class="vb"><thead><tr><td colspan="2" id="125866819"  class="head">Visual Basic</td></tr></thead><tbody><tr class="li1"><td><div id="125866819" style="height: 206px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="de1"><pre class="de1"><span class="kw2">Sub</span> TestArrayDtoD()
<span class="kw4">Dim</span> r <span class="kw4">As</span> <span class="kw2">New</span> BedvitCOM.VBA <span class="co1">'раннее связывание</span>
<span class="kw4">Dim</span> t, arr, i
arr = [a1:a1000000]
t = Timer
<span class="kw3">For</span> i = 1 <span class="kw3">To</span> 1000000
&nbsp; &nbsp; r.Array2Dto1D arr <span class="co1">'в одномерный (нижняя граница = 0 - по умолчанию)</span>
 &nbsp; &nbsp;r.Array1Dto2D arr, 1, 1 <span class="co1">'в двухмерный с 1м столбцом, нижние границы измерений = 1</span>
<span class="kw3">Next</span>
Debug.<span class="kw4">Print</span> <span class="st0">&quot;Time: &quot;</span> &amp; Timer - t &amp; <span class="st0">&quot; sec.&quot;</span>
<span class="kw3">End</span> <span class="kw2">Sub</span></pre></td></tr></table></div></td></tr></tbody></table></div><br />
<b>Тайминги</b>:<br />
Преобразование <b>массива из 1 млн строк</b> из двухмерного в одномерный и наоборот <b>1 млн. раз</b> = <b>0,121 sec.</b><br />
<br />
<br />
<b>начиная с v2.0.0.2</b><br />
<div class="codeblock"><table class="vb"><thead><tr><td colspan="2" id="617086875"  class="head">Visual Basic</td></tr></thead><tbody><tr class="li1"><td><div id="617086875" style="height: 174px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
</pre></td><td class="de1"><pre class="de1"><span class="kw2">Sub</span> TestArrayDtoD_()
&nbsp; &nbsp; <span class="co1">'Dim bVBA As New BedvitCOM.VBA 'раннее связывание</span>
 &nbsp; &nbsp;<span class="kw4">Dim</span> bVBA <span class="kw4">As</span> <span class="kw1">Object</span>: <span class="kw4">Set</span> bVBA = <span class="kw2">CreateObject</span>(<span class="st0">&quot;BedvitCOM.VBA&quot;</span>) <span class="co1">'позднее связывание</span>
 &nbsp; &nbsp;<span class="kw4">Dim</span> arr
&nbsp; &nbsp; arr = [a1:b10] <span class="co1">' забираем массив 2 столбца, 10 строк</span>
 &nbsp; &nbsp;bVBA.Array2Dto1D arr <span class="co1">'в одномерный (нижняя граница = 0 - по умолчанию)</span>
 &nbsp; &nbsp;bVBA.Array1Dto2D arr, 1, 1, 10 <span class="co1">'преобразуем в двухмерный с 10ю столбцами и 2 строками, нижние границы измерений = 1, порядок данных сохраняется исходный</span>
 &nbsp; &nbsp;Cells(1, 1).Resize(<span class="kw4">UBound</span>(arr, 1), <span class="kw4">UBound</span>(arr, 2)) = arr <span class="co1">'нового размера массив со старым порядком данных</span>
<span class="kw3">End</span> <span class="kw2">Sub</span></pre></td></tr></table></div></td></tr></tbody></table></div></div>

]]></content:encoded>
			<dc:creator>bedvit</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/829006/7235.html</guid>
		</item>
		<item>
			<title>unordered map в СOM, быстрая хеш-таблица, содержащая пары: уникальный ключ-значение</title>
			<link>https://www.cyberforum.ru/blogs/829006/7178.html</link>
			<pubDate>Thu, 01 Jul 2021 14:36:06 GMT</pubDate>
			<description>*Реализация в COM ассоциативного контейнера, содержащего пары ключ-значение с уникальными ключами....</description>
			<content:encoded><![CDATA[<div><b>Реализация в COM ассоциативного контейнера, содержащего пары ключ-значение с уникальными ключами. Поиск, вставка и удаление элементов имеют среднюю постоянную сложность.</b><br />
Часть библиотеки <a href="https://www.cyberforum.ru/blogs/829006/blog5958.html">BedvitCOM</a> (начиная с v1.0.4.7, в XLL c v2.0.1.5)<br />
Использован стандартный контейнер С++: <a rel="nofollow noopener noreferrer" href="https://en.cppreference.com/w/cpp/container/unordered_map" target="_blank" title="https://en.cppreference.com/w/cpp/container/unordered_map"><b>std::unordered_map</b></a> (хеш-таблица)<br />
<br />
КЛЮЧ: можно использовать любые данные (не включая ссылки на массивы и объекты), ключ хранится как строка (конвертируется, если нужно, из другого типа данных).<br />
<br />
ЗНАЧЕНИЕ: можно использовать любые данные (включая ссылки на массивы, объекты и даже на другую хеш-таблицу)<br />
<br />
interface IUnorderedMap : IDispatch<br />

			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   <br />
	[id(1), helpstring(&quot;Find&quot;)] HRESULT Find([in] VARIANT key, [in, out, optional] VARIANT* value, [out, retval] VARIANT* result);<br />
	[id(2), helpstring(&quot;Insert&quot;)] HRESULT Insert([in] VARIANT key, [in] VARIANT value, [out, retval] VARIANT* result);<br />
	[id(3), helpstring(&quot;InsertOrAssign&quot;)] HRESULT InsertOrAssign([in] VARIANT key, [in] VARIANT value, [out, retval] VARIANT* result);<br />
	[id(4), helpstring(&quot;Erase&quot;)] HRESULT Erase([in] VARIANT key, [out, retval] VARIANT* result);<br />
	[id(5), helpstring(&quot;Clear&quot;)] HRESULT Clear();<br />
	[id(6), helpstring(&quot;Size&quot;)] HRESULT Size([out, retval] LONG* result);<br />
	[id(7), helpstring(&quot;RangeSet&quot;)] HRESULT RangeSet([in] VARIANT range, [out, retval] LONG* result);<br />
	[id(8), helpstring(&quot;RangeGet&quot;)] HRESULT RangeGet([out] VARIANT* range, [in, defaultvalue(0)] LONG lowerBound, [out, retval] LONG* result);
				   </div>
			   </div><br />
<br />
<b>Методы</b>:<br />
1.<b>Find </b>(key,value) - Поиск значения по ключу, возвращает true, если найден. Если value задан - возвращает значение (опционально)<br />
2.<b>Insert</b>(key,value) - Вставляет пару ключ-значения по ключу, возвращает true, если успешно, false - если ключ уже есть (не перезаписывается)<br />
3.<b>InsertOrAssign</b>(key,value) - Вставляет или перезаписывает пару ключ-значения по ключу, возвращает true, если создан новый и false если обновлен уже существующий.<br />
4.<b>Erase</b>(key) - Удаляет пару ключ-значения по ключу, возвращает true, если успешно.<br />
5.<b>Clear</b>() - Очистить весь контейнер.<br />
6.<b>Size</b>() - Возвращает размер контейнера (количество пар ключ-значение)<br />
7.<b>RangeSet</b>(VARIANT range) - Вставляет пары ключ-значения из массива/диапазона, возвращает количество вставленных пар ключ-значение. Из дубликатов - загружается только первый по порядку.<br />
8.<b>RangeGet</b>(VARIANT range, lowerBound) - Возвращает количество выгруженных элементов в массив с указанной нижней границей массива (по умолчанию = 0)<br />
Следуя названию контейнера, стоит упомянуть, что порядок пар ключ-значение, определяется внутренней реализацией контейнера, и может не совпадать ни с порядком добавления пар, ни с каким-либо еще порядком сортировки и т.д.<br />
т.е. порядок элементов загруженного массива, может не совпадать с порядком элементов выгруженного.<br />
+хранятся только уникальные ключи, т.е. все последующие дубликаты не будут добавлены из исходного массива.<br />
<br />
<br />
<a rel="nofollow noopener noreferrer" href="https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&amp;FID=1&amp;TID=140763" target="_blank" title="https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&amp;FID=1&amp;TID=140763">Проведенные тесты и сравнения с Collection и Dictionary</a> (быстрее от нескольких раз до нескольких порядков)<br />
<br />
<br />
Пример использования в VBA<br />
<div class="codeblock"><table class="vb"><thead><tr><td colspan="2" id="62037345"  class="head">Visual Basic</td></tr></thead><tbody><tr class="li1"><td><div id="62037345" style="height: 334px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td class="de1"><pre class="de1"><span class="kw2">Sub</span> UnorderedMap()
<span class="kw4">Dim</span> key, value, value2, sizeU, x, arrU
<span class="co1">'Dim U As New BedvitCOM.UnorderedMap 'раннее связывание</span>
<span class="kw4">Dim</span> U: <span class="kw4">Set</span> U = <span class="kw2">CreateObject</span>(<span class="st0">&quot;BedvitCOM.UnorderedMap&quot;</span>) <span class="co1">'позднее связывание</span>
&nbsp;
key = <span class="st0">&quot;key&quot;</span> <span class="co1">'ключ</span>
value = <span class="st0">&quot;value&quot;</span> <span class="co1">'значение</span>
<span class="kw3">If</span> <span class="kw3">Not</span> U.Insert(key, value) <span class="kw3">Then</span> MsgBox <span class="st0">&quot;Элемент уже существует и не был обновлен&quot;</span>
<span class="kw3">If</span> <span class="kw3">Not</span> U.InsertOrAssign(key, value) <span class="kw3">Then</span> MsgBox <span class="st0">&quot; = False (False - Элемент обновлен, True - то создан новый)&quot;</span>
<span class="kw3">If</span> <span class="kw3">Not</span> U.Find(key, value2) <span class="kw3">Then</span> MsgBox <span class="st0">&quot;Не удалось найти элемент&quot;</span> <span class="co1">'выводим найденный результат по ключу</span>
<span class="kw3">If</span> <span class="kw3">Not</span> U.Erase(key) <span class="kw3">Then</span> MsgBox <span class="st0">&quot;Не удалось удалить элемент&quot;</span> <span class="co1">'очистка элемента по ключу</span>
&nbsp;
x = U.RangeSet(Range(<span class="st0">&quot;a1:b5&quot;</span>).value) <span class="co1">'x - количество загруженных элементов в map (первый дубликат)</span>
x = U.RangeGet(arrU, 1) <span class="co1">'x - количество выгруженных элементов в массив '1-нижняя граница массива</span>
Range(<span class="st0">&quot;c1&quot;</span>).Resize(x, 2) = arrU
&nbsp;
Debug.<span class="kw4">Print</span> U.Size <span class="co1">'количество элементов контейнера</span>
U.Clear <span class="co1">'очистить весь контейнер</span>
<span class="kw3">End</span> <span class="kw2">Sub</span></pre></td></tr></table></div></td></tr></tbody></table></div></div>

]]></content:encoded>
			<dc:creator>bedvit</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/829006/7178.html</guid>
		</item>
		<item>
			<title>Хеширование строки алгоритмами SHA (СОМ-реализация) + шифрование AES</title>
			<link>https://www.cyberforum.ru/blogs/829006/6807.html</link>
			<pubDate>Tue, 03 Nov 2020 08:13:00 GMT</pubDate>
			<description>Реализация в СОМ. Реализация для XLL как функция COM.DLL  
Часть библиотеки BedvitCOM...</description>
			<content:encoded><![CDATA[<div>Реализация в СОМ. Реализация для XLL как функция COM.DLL <br />
Часть библиотеки <a href="https://www.cyberforum.ru/blogs/829006/blog5958.html">BedvitCOM</a><br />
Использованы исходники <a rel="nofollow noopener noreferrer" href="https://www.cryptopp.com/wiki/Main_Page" target="_blank" title="https://www.cryptopp.com/wiki/Main_Page">Crypto++</a><br />
<br />
Функция:<br />
<b>HashStringSHA</b>(<i>StringIn</i>, <i>VersionSHA</i>) <br />
<br />
Параметры функции:<br />
1.<i>StringIn </i>- входящая строка<br />
2.<i>VersionSHA </i>- версия алгоритма SHA<br />
<br />
Поддержка следующих алгоритмов (+ новейшие SHA3) :<br />
VersionSHA = 1,       SHA1<br />
VersionSHA = 2224, SHA2_224 <br />
VersionSHA = 2256, SHA2_256 <br />
VersionSHA = 2384, SHA2_384 <br />
VersionSHA = 2512, SHA2_512 <br />
VersionSHA = 3224, SHA3_224 <br />
VersionSHA = 3256, SHA3_256 <br />
VersionSHA = 3384, SHA3_384 <br />
VersionSHA = 3512, SHA3_512 <br />
<br />
<br />
<br />
<b>Upd 14.06.2023</b><br />
Начиная с версий COM.v3.5 и XLL.dll_v4.6 <b>HashStringSHA()</b> замена на аналогичную функцию с поддержкой UTF8 <b>SHAstrUTF8()</b><br />
Параметры функции:<br />
1.<i>StringIn </i>- входящая строка<br />
2.<i>VersionSHA </i>- версия алгоритма SHA<br />
3.<i>charLower</i> - вывод результата в нижнем регистре (опционально, по умолчанию FALSE)<br />
<br />
Пример использования<br />
<div class="codeblock"><table class="vb"><thead><tr><td colspan="2" id="369073808"  class="head">Visual Basic</td></tr></thead><tbody><tr class="li1"><td><div id="369073808" style="height: 94px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
</pre></td><td class="de1"><pre class="de1"><span class="kw2">Sub</span> SHA_1()
<span class="kw4">Dim</span> bCOM <span class="kw4">As</span> <span class="kw2">New</span> BedvitCOM.VBA
Debug.<span class="kw4">Print</span> bCOM.SHAstrUTF8(<span class="st0">&quot;String&quot;</span>, 1) <span class="co1">'VersionSHA = 1, &nbsp; &nbsp; &nbsp; SHA1</span>
<span class="kw3">End</span> <span class="kw2">Sub</span></pre></td></tr></table></div></td></tr></tbody></table></div>+Добавлены новые с поддержкой UTF8 :<br />
<b>MDstrUTF8()</b><br />
Параметры функции:<br />
1.<i>StringIn </i>- входящая строка<br />
2.<i>versionMD</i>- версия алгоритма MD<br />
3.<i>charLower</i> - вывод результата в нижнем регистре (опционально, по умолчанию FALSE)<br />
<br />
Поддержка следующих алгоритмов:<br />
versionMD = 5,        MD5<br />
<br />
<b>AES128strUTF8()</b> -  симметричный алгоритм блочного шифрования<br />
Параметры функции:<br />
1.<i>StringIn </i>- входящая строка<br />
2.<i>key</i>- ключ должен быть длинной 128, 256 bit (16, 32 Byte).<br />
3.<i>decrypt</i> - decrypt/encrypt (true/false)<br />
4.<i>mode</i> - Supporter mode : ECB, CBC, OFB, CFB, CBC-CTS, CTR<br />
5.<i>initializationVectorIV</i> - <a rel="nofollow noopener noreferrer" href="https://en.wikipedia.org/wiki/Initialization_vector" target="_blank" title="https://en.wikipedia.org/wiki/Initialization_vector">an initialization vector (IV)</a><br />
6.<i>str_format_hex</i> - вывод результата в формате Hex/Base64 (true/false)<br />
<br />
<br />
<br />
<b>Upd 21.01.2024</b><br />
Начиная с версий BedvitCOM.dll_<b>v4.0</b> и BedvitXLL.dll_<b>v5.0</b><br />
Функция <b>AES128strUTF8() </b>- переименована в <b>AESstrUTF8()</b>, т.к. 128 или 256 bit зависит от длины ключа, который введет пользователь 16 или 32 символа (EN - 1 байт и RU - 2 байта на символ в utf-8 соответственно)<br />
AESstrUTF8() - изменились индексы алгоритмов шифрования, теперь у всех функций по шифрованию <a rel="nofollow noopener noreferrer" href="http://bedvit.ru/xll/crypto/" target="_blank" title="http://bedvit.ru/xll/crypto/">одинаковые индексы для алгоритмов AES</a></div>

]]></content:encoded>
			<dc:creator>bedvit</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/829006/6807.html</guid>
		</item>
		<item>
			<title>Быстрая реализация сортировки и удаления дубликатов строк в csv/txt(ANSI) файлах (WinAPI + С++)</title>
			<link>https://www.cyberforum.ru/blogs/829006/6656.html</link>
			<pubDate>Fri, 03 Jul 2020 13:07:13 GMT</pubDate>
			<description>Реализация для *XLL как функция COM*. Реализация в *СОМ.* 
Часть библиотеки BedvitCOM...</description>
			<content:encoded><![CDATA[<div>Реализация для <b>XLL как функция COM</b>. Реализация в <b>СОМ.</b><br />
Часть библиотеки <a href="https://www.cyberforum.ru/blogs/829006/blog5958.html">BedvitCOM</a><br />
Сортировка и удаление (опционально) в .txt-файле размером <b>1Гб, 4 млн. строк. = <s>3,0</s> 1,6 сек.</b> (файл кеширован)<br />
Потребление памяти: размер файла + (от 4Кб*5 до 16Мб*2) (в зависимости от размера файла, на буферы и сортировку) <br />
Алгоритм оптимизирован на большие файлы. Есть возможность уменьшить еще выделение памяти, но с ущербом для производительности.<br />
<br />
Особенности:<br />
1.WinAPI: <b>CreateFile + ReadFile</b><br />
2.<b>Асинхронность </b>в чтения с диска и выполнения рабочего кода.<br />
3.Возможность отключения системного кеширования.<br />
4.Кодировка <b>csv/txt - ANSI</b><br />
5.Размер файла ограничен выделяемой памятью (ОЗУ+Файл подкачки)<br />
6.Параллельный алгоритм сортировки <a rel="nofollow noopener noreferrer" href="https://docs.microsoft.com/ru-ru/cpp/parallel/concrt/parallel-algorithms?view=vs-2019" target="_blank" title="https://docs.microsoft.com/ru-ru/cpp/parallel/concrt/parallel-algorithms?view=vs-2019">concurrency::parallel_buffered_sort</a><br />
7.Бинарное сравнение символов (strcmp).<s> Возможно в следующей версии добавлю локаль(strcoll).</s> Добавлено.<br />
Бинарное сравнение быстрее в разы, чем сравнение по локальным правилам.<br />
8.Функция возвращает итоговое количество строк записанное в итоговый файл.<br />
9.Поддерживается <a rel="nofollow noopener noreferrer" href="https://tools.ietf.org/html/rfc4180" target="_blank" title="https://tools.ietf.org/html/rfc4180">Стандарт RFC 4180</a><br />
<br />
<b>СОМ функция:</b><br />
[id(13), helpstring(&quot;Sort and Delete Duplicates Rows CSV-file encoded ANSI&quot;)] <br />
HRESULT <b>SortDeleteDuplicateRowsCSVansi</b><br />
([in] BSTR <b>FileIn</b>, <br />
[in] BSTR <b>FileOut</b>, <br />
[in, defaultvalue(0)]  LONG <b>HeaderRowsCount</b>, <br />
[in, defaultvalue(0)] LONG <b>OnlySort</b>, <br />
[in, defaultvalue(0)] LONG <b>SortOrder</b>, <br />
[in, defaultvalue(0)] LONG <b>FileFlagNoBuffering</b>,<br />
[in, defaultvalue(0)] LONG <b>SetLocale</b>, <br />
[in, defaultvalue(L&quot;&quot;)] BSTR <b>Locale</b>,<br />
[out, retval] LONG* <b>RowsCountOut</b>);<br />
<br />
1.FileIn - файл исходный (обязательный)<br />
2.FileOut - файл итоговый (обязательный), может быть = FileIn, данная ситуация обрабатывается правильно (начиная с версии v1.0.2.9)<br />
3.HeaderRowsCount - количество строк заголовка (по умолчанию: 0)<br />
4.OnlySort - только сортировка 0/1 (по умолчанию: 0 - сортировка+удаление дубликатов строк)<br />
5.SortOrder - порядок сортировки 0/1 (по умолчанию: 0 - по возрастанию)<br />
6.FileFlagNoBuffering - отключение системного кеширования чтения/записи файла 0/1 (по умолчанию: 0 - кеширование не отключается)(начиная с версии v1.0.2.9)<br />
Использование в случаях, когда размер файла сравним с размером ОЗУ (не создается доп. буфера файловой системы, за счет чего меньше пишется в файл подкачки и в разы быстрее выполняется код).<br />
7.SetLocale - включить локальные настройки для сортировки 0/1 (по умолчанию: 0 - не включены, бинарное сравнение)<br />
8.Locale - при включенном параметре SetLocale (1), задает локаль (Language tag). (по умолчанию: &quot;&quot; (пусто) - текущей локальные настройки, к примеру для России <b>&quot;ru-RU&quot;</b>)<br />
Весь список см. по ссылке: <br />
<a rel="nofollow noopener noreferrer" href="https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/a9eac961-e77d-41a6-90a5-ce1a8b0cdb9c" target="_blank" title="https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/a9eac961-e77d-41a6-90a5-ce1a8b0cdb9c">https://docs.microsoft.com/en-... 1a8b0cdb9c</a><br />
9.RowsCountOut - Возвращает количество строк в итоговом файле, с учетом количества строк заголовка (возвращаемое значение)<br />
<br />
Запуск из VBA<br />
<div class="codeblock"><table class="vb"><thead><tr><td colspan="2" id="67345437"  class="head">Visual Basic</td></tr></thead><tbody><tr class="li1"><td><div id="67345437" style="height: 78px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
</pre></td><td class="de1"><pre class="de1"><span class="kw2">Sub</span> Test()
Debug.<span class="kw4">Print</span> <span class="kw2">CreateObject</span>(<span class="st0">&quot;BedvitCOM.VBA&quot;</span>).SortDeleteDuplicateRowsCSVansi(<span class="st0">&quot;C:\CSV_1_GB.csv&quot;</span>, <span class="st0">&quot;C:\CSV_1_GB_out.csv&quot;</span>, 0, 1, 0) <span class="co1">' sort file 1Gb</span>
<span class="kw3">End</span> <span class="kw2">Sub</span></pre></td></tr></table></div></td></tr></tbody></table></div>С локальными настройками:<br />
<div class="codeblock"><table class="vb"><thead><tr><td colspan="2" id="496409941"  class="head">Visual Basic</td></tr></thead><tbody><tr class="li1"><td><div id="496409941" style="height: 78px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
</pre></td><td class="de1"><pre class="de1"><span class="kw2">Sub</span> Test()
Debug.<span class="kw4">Print</span> <span class="kw2">CreateObject</span>(<span class="st0">&quot;BedvitCOM.VBA&quot;</span>).SortDeleteDuplicateRowsCSVansi(<span class="st0">&quot;C:\CSV_1_GB.csv&quot;</span>, <span class="st0">&quot;C:\CSV_1_GB_out.csv&quot;</span>, 0, 1, 0, 1, <span class="st0">&quot;ru-RU&quot;</span>) <span class="co1">' sort file 1Gb Russian</span>
<span class="kw3">End</span> <span class="kw2">Sub</span></pre></td></tr></table></div></td></tr></tbody></table></div></div>


<!-- attachments -->
	<div style="margin-top:10px">

		
			<fieldset class="fieldset">
				<legend>Миниатюры</legend>
				<div style="padding:3px">
				
	<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=6352&amp;d=1594904521" target="attachment" rel="Lightbox" id="attachment6352"><img loading="lazy" decoding="async" class="thumbnail" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=6352&amp;stc=1&amp;thumb=1&amp;d=1594904521" border="0" alt="Нажмите на изображение для увеличения
Название: test5.PNG
Просмотров: 642
Размер:	13.4 Кб
ID:	6352" /></a>
	&nbsp;
	

				</div>
			</fieldset>
		
		
		
		

	</div>
<!-- / attachments -->
]]></content:encoded>
			<dc:creator>bedvit</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/829006/6656.html</guid>
		</item>
		<item>
			<title>Быстрая реализация поиска строк в csv/txt(ANSI) файлах (WinAPI + С++)</title>
			<link>https://www.cyberforum.ru/blogs/829006/6617.html</link>
			<pubDate>Sat, 06 Jun 2020 20:22:55 GMT</pubDate>
			<description>Реализация для *XLL *как *функция Excel*. В планах, реализация в *СОМ*. Реализовано. 
Часть...</description>
			<content:encoded><![CDATA[<div>Реализация для <b>XLL </b>как <b>функция Excel</b>.<s> В планах, реализация в <b>СОМ</b>.</s> Реализовано.<br />
Часть библиотеки <a href="https://www.cyberforum.ru/blogs/829006/blog5958.html">BedvitXLL</a><br />
Особенности реализации:<br />
1.<b>WinAPI</b>: CreateFile + ReadFile<br />
2.<b>Асинхронность</b> в чтения с диска и выполнения рабочего кода.<br />
3.Возможность <b>отключения </b>системного <b>кеширования</b>.<br />
4.Посему <b>чтение блоками</b>, кратно степени двойки - по 16 Мб.(16777216 байт), в большинстве hdd - такого размера свой кеш.<br />
5.Посему адрес принимающего буфера и рабочего выровнен по размеру сектора/страницы - 4096 байт<br />
6.Возможность вывода <b>всех</b> найденных <b>строк</b> или <b>первой</b> найденной (поиск с начала файла)<br />
7.Строка выводится <b>вся</b>, в т.ч. с разделителями.<br />
8.Кодировка csv/txt - <b>ANSI </b><br />
9.Размер искомой строки и подстроки поиска не может быть больше буфера (16 Мб). <br />
10.Файл может быть <b>любого размера.</b><br />
11.Поддерживается <a rel="nofollow noopener noreferrer" href="https://tools.ietf.org/html/rfc4180" target="_blank" title="https://tools.ietf.org/html/rfc4180">Стандарт RFC 4180</a><br />
<br />
Функции:<br />
1.<b>GetRowsCountCSVansi</b>(Файл(строка), ОтключениеКешированияФайла(0/1)) - возвращает кол-во строк в файле (учитываются пустые строки, расчет происходит по количеству разделителей строк)<br />
2.<b>GetRowCSVansi</b>(Файл(строка), ПодстрокаДляПоиска(индекс), ОтключениеКешированияФайла(0/1)) - возвращает найденную строку по индексу<br />
3.<b>FindRowsInCSVansi</b>(Файл(строка), ПодстрокаДляПоиска(строка), ВывестиВсеСтроки(0/1), ОтключениеКешированияФайла(0/1)) - возвращает найденную строку/строки по искомой подстроке<br />
<br />
Код:<br />

			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   <div class="codeblock"><table class="cpp"><thead><tr><td colspan="2" id="203657861"  class="head">C++</td></tr></thead><tbody><tr class="li1"><td><div id="203657861" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
</pre></td><td class="de1"><pre class="de1"><span class="kw4">extern</span> <span class="st0">&quot;C&quot;</span> __declspec<span class="br0">&#40;</span>dllexport<span class="br0">&#41;</span> LPXLOPER12 &nbsp;WINAPI FindRowsInCSVansi<span class="br0">&#40;</span><span class="kw4">wchar_t</span> <span class="sy2">*</span> &nbsp;file, <span class="kw4">char</span><span class="sy2">*</span> findStr, <span class="kw4">bool</span> multiLine, <span class="kw4">int</span> fileFlagNoBuffering<span class="br0">&#41;</span>
<span class="br0">&#123;</span>
&nbsp; &nbsp; LPXLOPER12 OperOut <span class="sy1">=</span> TempErr12<span class="br0">&#40;</span>xlerrValue<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; <span class="kw4">const</span> DWORD &nbsp;nNumberOfBytesToRead <span class="sy1">=</span> <span class="nu0">16777216</span><span class="sy4">;</span><span class="co1">//67108864;//33554432; //16777216;//8388608;//читаем в буфер байты</span>
&nbsp; &nbsp; <span class="kw4">size_t</span> findStrLen <span class="sy1">=</span> <span class="kw3">strlen</span><span class="br0">&#40;</span>findStr<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>findStrLen <span class="sy1">&gt;=</span> nNumberOfBytesToRead<span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="kw1">return</span> OperOut<span class="sy4">;</span> <span class="br0">&#125;</span><span class="sy4">;</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// создаем события с автоматическим сбросом</span>
&nbsp; &nbsp; HANDLE hEndRead <span class="sy1">=</span> CreateEvent<span class="br0">&#40;</span><span class="kw2">NULL</span>, FALSE, FALSE, <span class="kw2">NULL</span><span class="br0">&#41;</span><span class="sy4">;</span><span class="co1">// дескриптор события</span>
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>hEndRead <span class="sy1">==</span> <span class="kw2">NULL</span><span class="br0">&#41;</span><span class="br0">&#123;</span>&nbsp; <span class="kw1">return</span> OperOut<span class="sy4">;</span> <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// открываем файл для чтения</span>
&nbsp; &nbsp; HANDLE hFile <span class="sy1">=</span> CreateFile<span class="br0">&#40;</span>&nbsp; <span class="co1">// дескриптор файла</span>
&nbsp; &nbsp; &nbsp; &nbsp; file, &nbsp; <span class="co1">// имя файла</span>
&nbsp; &nbsp; &nbsp; &nbsp; GENERIC_READ, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">// чтение из файла</span>
&nbsp; &nbsp; &nbsp; &nbsp; FILE_SHARE_READ, &nbsp; &nbsp; &nbsp; <span class="co1">// совместный доступ к файлу</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">NULL</span>, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">// защиты нет</span>
&nbsp; &nbsp; &nbsp; &nbsp; OPEN_EXISTING, &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// открываем существующий файл</span>
&nbsp; &nbsp; &nbsp; &nbsp; FILE_FLAG_OVERLAPPED <span class="sy3">|</span> <span class="br0">&#40;</span>fileFlagNoBuffering <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">0</span> <span class="sy4">?</span> FILE_FLAG_NO_BUFFERING <span class="sy4">:</span> FILE_FLAG_RANDOM_ACCESS<span class="br0">&#41;</span>,<span class="co1">// асинхронный ввод//отключаем системный буфер</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">NULL</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// шаблона нет</span>
&nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="co1">// проверяем на успешное открытие</span>
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>hFile <span class="sy1">==</span> INVALID_HANDLE_VALUE<span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; CloseHandle<span class="br0">&#40;</span>hEndRead<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> OperOut<span class="sy4">;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; <span class="kw4">char</span><span class="sy2">*</span> notAlignBuf <span class="sy1">=</span> <span class="kw3">new</span> <span class="kw4">char</span><span class="br0">&#91;</span>nNumberOfBytesToRead <span class="sy2">*</span> <span class="nu0">2</span> <span class="sy2">+</span> <span class="nu0">4096</span> <span class="sy2">+</span> <span class="nu0">1</span><span class="br0">&#93;</span><span class="sy4">;</span> <span class="co1">//буфер</span>
&nbsp; &nbsp; <span class="kw4">char</span><span class="sy2">*</span> buf <span class="sy1">=</span> notAlignBuf <span class="sy2">+</span> nNumberOfBytesToRead<span class="sy4">;;</span> <span class="co1">//буфер</span>
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw4">size_t</span><span class="br0">&#40;</span>buf<span class="br0">&#41;</span> <span class="sy2">%</span> <span class="nu0">4096</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> buf <span class="sy2">+</span><span class="sy1">=</span> <span class="nu0">4096</span> <span class="sy2">-</span> <span class="br0">&#40;</span><span class="kw4">size_t</span><span class="br0">&#40;</span>buf<span class="br0">&#41;</span> <span class="sy2">%</span> <span class="nu0">4096</span><span class="br0">&#41;</span><span class="sy4">;</span> <span class="br0">&#125;</span><span class="co1">//адрес принимающего буфера тоже должен быть выровнен по размеру сектора/страницы </span>
&nbsp;
&nbsp; &nbsp; <span class="kw4">char</span><span class="sy2">*</span> notAlignBufWork <span class="sy1">=</span> <span class="kw3">new</span> <span class="kw4">char</span><span class="br0">&#91;</span>nNumberOfBytesToRead <span class="sy2">*</span> <span class="nu0">2</span> <span class="sy2">+</span> <span class="nu0">4096</span> <span class="sy2">+</span> <span class="nu0">1</span><span class="br0">&#93;</span><span class="sy4">;</span> <span class="co1">//буфер Рабочий</span>
&nbsp; &nbsp; <span class="kw4">char</span><span class="sy2">*</span> bufWork <span class="sy1">=</span> notAlignBufWork <span class="sy2">+</span> nNumberOfBytesToRead<span class="sy4">;</span> <span class="co1">//буфер</span>
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw4">size_t</span><span class="br0">&#40;</span>bufWork<span class="br0">&#41;</span> <span class="sy2">%</span> <span class="nu0">4096</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> bufWork <span class="sy2">+</span><span class="sy1">=</span> <span class="nu0">4096</span> <span class="sy2">-</span> <span class="br0">&#40;</span><span class="kw4">size_t</span><span class="br0">&#40;</span>bufWork<span class="br0">&#41;</span> <span class="sy2">%</span> <span class="nu0">4096</span><span class="br0">&#41;</span><span class="sy4">;</span> <span class="br0">&#125;</span><span class="co1">//адрес рабочего буфера тоже выровнял по размеру сектора/страницы &nbsp;</span>
&nbsp;
&nbsp; &nbsp; buf<span class="br0">&#91;</span>nNumberOfBytesToRead<span class="br0">&#93;</span> <span class="sy1">=</span> <span class="st0">'<span class="es5">\0</span>'</span><span class="sy4">;</span><span class="co1">//добавим нуль-терминатор</span>
&nbsp; &nbsp; bufWork<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> <span class="sy1">=</span> <span class="st0">'<span class="es5">\0</span>'</span><span class="sy4">;</span><span class="co1">//добавим нуль-терминатор</span>
&nbsp; &nbsp; bufWork<span class="br0">&#91;</span>nNumberOfBytesToRead<span class="br0">&#93;</span> <span class="sy1">=</span> <span class="st0">'<span class="es5">\0</span>'</span><span class="sy4">;</span><span class="co1">//добавим нуль-терминатор</span>
&nbsp;
&nbsp; &nbsp; DWORD dwBytesReadWork <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span>
&nbsp; &nbsp; DWORD findStatus <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span> <span class="co1">//статус поиска</span>
&nbsp; &nbsp; <span class="kw4">bool</span> errHandleEOF <span class="sy1">=</span> <span class="kw2">false</span><span class="sy4">;</span> <span class="co1">//метка конца файла</span>
&nbsp; &nbsp; <span class="kw4">char</span><span class="sy2">*</span> find<span class="sy4">;</span><span class="co1">// указатель для поиска</span>
&nbsp; &nbsp; <span class="kw4">char</span><span class="sy2">*</span> strStart<span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw4">char</span><span class="sy2">*</span> strEnd<span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw4">char</span><span class="sy2">*</span> bufWorkNew <span class="sy1">=</span> bufWork<span class="sy4">;</span><span class="co1">//буфер с учетом полной строки</span>
&nbsp; &nbsp; <span class="kw4">size_t</span> strStartLen <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw4">size_t</span> strCount <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span> <span class="co1">//счетчик строк</span>
&nbsp; &nbsp; std<span class="sy4">::</span><span class="me2">string</span> strOut<span class="sy4">;</span> <span class="co1">//итоговая строка</span>
&nbsp;
&nbsp; &nbsp; _ULARGE_INTEGER ui<span class="sy4">;</span> <span class="co1">//Представляет 64-разрядное целое число без знака обединяя два 32-х разрядных</span>
&nbsp; &nbsp; ui.<span class="me1">QuadPart</span> <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span>
&nbsp;
&nbsp; &nbsp; OVERLAPPED &nbsp;ovl<span class="sy4">;</span> &nbsp; <span class="co1">// структура управления асинхронным доступом к файлу// инициализируем структуру OVERLAPPED</span>
&nbsp; &nbsp; ovl.<span class="me1">Offset</span> <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span> &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// младшая часть смещения равна 0</span>
&nbsp; &nbsp; ovl.<span class="me1">OffsetHigh</span> <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span> &nbsp; &nbsp; &nbsp;<span class="co1">// старшая часть смещения равна 0</span>
&nbsp; &nbsp; ovl.<span class="me1">hEvent</span> <span class="sy1">=</span> hEndRead<span class="sy4">;</span> &nbsp; <span class="co1">// событие для оповещения завершения чтения</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// читаем данные из файла</span>
&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="sy4">;;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; DWORD &nbsp;dwBytesRead<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; DWORD &nbsp;dwError<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; find <span class="sy1">=</span> buf<span class="sy4">;</span> <span class="co1">//буфер</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// читаем одну запись</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy3">!</span>ReadFile<span class="br0">&#40;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hFile, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// дескриптор файла</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buf, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// адрес буфера, куда читаем данные</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; nNumberOfBytesToRead,<span class="co1">// количество читаемых байтов</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy3">&amp;</span>dwBytesRead, &nbsp; &nbsp;<span class="co1">// количество прочитанных байтов</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy3">&amp;</span>ovl &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// чтение асинхронное</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">switch</span> <span class="br0">&#40;</span>dwError <span class="sy1">=</span> GetLastError<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="co1">// решаем что делать с кодом ошибки</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//эти ошибки смотрм после завершения асинхронной операции чтения, для возможности обработать рабочий буфер</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> ERROR_IO_PENDING<span class="sy4">:</span> <span class="br0">&#123;</span> <span class="kw1">break</span><span class="sy4">;</span> <span class="br0">&#125;</span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">// асинхронный ввод-вывод все еще происходит // сделаем кое-что пока он идет </span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> ERROR_HANDLE_EOF<span class="sy4">:</span> <span class="br0">&#123;</span> errHandleEOF <span class="sy1">=</span> <span class="kw2">true</span><span class="sy4">;</span> &nbsp; <span class="kw1">break</span><span class="sy4">;</span> <span class="br0">&#125;</span> <span class="co1">// мы достигли конца файла читалкой ReadFile</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">default</span><span class="sy4">:</span> <span class="br0">&#123;</span><span class="kw1">goto</span> return1<span class="sy4">;</span> <span class="br0">&#125;</span><span class="co1">// другие ошибки</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//работаем асинхронно, выполняем код, пока ждем чтение с диска//</span>
&nbsp; &nbsp; &nbsp; &nbsp; bufWork<span class="br0">&#91;</span>dwBytesReadWork<span class="br0">&#93;</span> <span class="sy1">=</span> <span class="st0">'<span class="es5">\0</span>'</span><span class="sy4">;</span><span class="co1">//добавим нуль-терминатор</span>
&nbsp; &nbsp; goNextFind<span class="sy4">:</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>findStatus <span class="sy1">==</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="co1">//goFind</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; find <span class="sy1">=</span> <span class="kw3">strstr</span><span class="br0">&#40;</span>bufWorkNew, findStr<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>find <span class="sy3">!</span><span class="sy1">=</span> <span class="kw2">NULL</span><span class="br0">&#41;</span> <span class="co1">//если нужная подстрока найдена</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>strStart <span class="sy1">=</span> find<span class="sy4">;</span> strStart <span class="sy1">&gt;=</span> bufWorkNew<span class="sy4">;</span> strStart<span class="sy2">--</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy2">*</span>strStart <span class="sy1">==</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="kw1">break</span><span class="sy4">;</span> <span class="br0">&#125;</span> <span class="co1">//если нашли начало строки</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strStart<span class="sy2">++</span><span class="sy4">;</span> <span class="co1">//не учитываем '\n'</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strEnd <span class="sy1">=</span> <span class="kw3">strchr</span><span class="br0">&#40;</span>find, <span class="st0">'<span class="es1">\n</span>'</span><span class="br0">&#41;</span><span class="sy4">;</span> <span class="co1">//ищем конец строки</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>strEnd <span class="sy3">!</span><span class="sy1">=</span> <span class="kw2">NULL</span><span class="br0">&#41;</span> <span class="co1">//если нашли конец строки</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strOut <span class="sy1">=</span> strOut <span class="sy2">+</span> std<span class="sy4">::</span><span class="me2">string</span><span class="br0">&#40;</span>strStart, strEnd <span class="sy2">-</span> strStart <span class="sy2">+</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy3">!</span>multiLine<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">goto</span> return0<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span><span class="co1">//поиск в следующей строке начинаем с конца предыдущей</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bufWorkNew <span class="sy1">=</span> strEnd<span class="sy2">++</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; findStatus <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">goto</span> goNextFind<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span><span class="co1">//если конец строки в следующем буфере или конец файла</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strOut <span class="sy1">=</span> strOut <span class="sy2">+</span> std<span class="sy4">::</span><span class="me2">string</span><span class="br0">&#40;</span>strStart<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; findStatus <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="co1">//если нужная подстрока найдена</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span>findStatus <span class="sy1">==</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="co1">//goBuf</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strEnd <span class="sy1">=</span> <span class="kw3">strchr</span><span class="br0">&#40;</span>bufWork, <span class="st0">'<span class="es1">\n</span>'</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>strEnd <span class="sy3">!</span><span class="sy1">=</span> <span class="kw2">NULL</span><span class="br0">&#41;</span> <span class="co1">//если нашли конец строки</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strOut <span class="sy1">=</span> strOut <span class="sy2">+</span> std<span class="sy4">::</span><span class="me2">string</span><span class="br0">&#40;</span>bufWork, strEnd <span class="sy2">-</span> bufWork <span class="sy2">+</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; findStatus <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy3">!</span>multiLine<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">goto</span> return0<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span><span class="co1">//поиск в следующей строке начинаем с конца предыдущей</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bufWorkNew <span class="sy1">=</span> strEnd<span class="sy2">++</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; findStatus <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">goto</span> goNextFind<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span><span class="co1">//если конец строки в следующем буфере или конец файла</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strOut <span class="sy1">=</span> strOut <span class="sy2">+</span> std<span class="sy4">::</span><span class="me2">string</span><span class="br0">&#40;</span>bufWork<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//блок дозагрузки рабочего буфера межбуферной строкой</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">char</span><span class="sy2">*</span> bufWorkEnd <span class="sy1">=</span> bufWork <span class="sy2">+</span> dwBytesReadWork<span class="sy4">;</span> <span class="co1">//конец буфера</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>strStart <span class="sy1">=</span> bufWorkEnd<span class="sy4">;</span> strStart <span class="sy1">&gt;=</span> bufWork<span class="sy4">;</span> strStart<span class="sy2">--</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy2">*</span>strStart <span class="sy1">==</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="kw1">break</span><span class="sy4">;</span> <span class="br0">&#125;</span> <span class="br0">&#125;</span> <span class="co1">//если нашли начало строки</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>strStart <span class="sy1">&lt;</span> bufWork <span class="sy3">&amp;&amp;</span> ui.<span class="me1">QuadPart</span> <span class="sy1">&gt;=</span> nNumberOfBytesToRead<span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="kw1">goto</span> return1<span class="sy4">;</span> <span class="br0">&#125;</span><span class="sy4">;</span> <span class="co1">//если строка больше буфера (не найден разделитель), кроме первого буфера</span>
&nbsp; &nbsp; &nbsp; &nbsp; strStartLen <span class="sy1">=</span> <span class="br0">&#40;</span>bufWorkEnd <span class="sy2">-</span> <span class="sy2">++</span>strStart<span class="br0">&#41;</span><span class="sy4">;</span> <span class="co1">//размер буфера, который добавляем к рабочему</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//пишем начало строки в новый буфер</span>
&nbsp; &nbsp; &nbsp; &nbsp; bufWorkNew <span class="sy1">=</span> buf <span class="sy2">-</span> strStartLen<span class="sy4">;</span><span class="co1">//bufWorkNew = bufWork - strStartLen;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">memcpy</span><span class="br0">&#40;</span>bufWorkNew, strStart, strStartLen<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>errHandleEOF<span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="kw1">goto</span> return0<span class="sy4">;</span> <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//работаем асинхронно, выполняем код, пока ждем чтение с диска//</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// ждем, пока завершится асинхронная операция чтения</span>
&nbsp; &nbsp; &nbsp; &nbsp; WaitForSingleObject<span class="br0">&#40;</span>hEndRead, INFINITE<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// проверим результат работы асинхронного чтения // если возникла проблема ... </span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy3">!</span>GetOverlappedResult<span class="br0">&#40;</span>hFile, <span class="sy3">&amp;</span>ovl, <span class="sy3">&amp;</span>dwBytesRead, FALSE<span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">switch</span> <span class="br0">&#40;</span>dwError <span class="sy1">=</span> GetLastError<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="co1">// решаем что делать с кодом ошибки</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> ERROR_HANDLE_EOF<span class="sy4">:</span> <span class="br0">&#123;</span> <span class="kw1">goto</span> return0<span class="sy4">;</span> <span class="kw1">break</span><span class="sy4">;</span> <span class="br0">&#125;</span><span class="co1">//если конец файла. но мы должны вернутся найти начало строки.</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// мы достигли конца файла в ходе асинхронной операции</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">default</span><span class="sy4">:</span> <span class="br0">&#123;</span><span class="kw1">goto</span> return1<span class="sy4">;</span> <span class="br0">&#125;</span><span class="co1">// другие ошибки</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="co1">// конец процедуры switch (dwError = GetLastError())</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//меняем буфер</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">char</span><span class="sy2">*</span> bufTmp <span class="sy1">=</span> bufWork<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; bufWork <span class="sy1">=</span> buf<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; buf <span class="sy1">=</span> bufTmp<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// увеличиваем смещение в файле</span>
&nbsp; &nbsp; &nbsp; &nbsp; dwBytesReadWork <span class="sy1">=</span> dwBytesRead<span class="sy4">;</span><span class="co1">//кол-во считанных байт</span>
&nbsp; &nbsp; &nbsp; &nbsp; ui.<span class="me1">QuadPart</span> <span class="sy2">+</span><span class="sy1">=</span> nNumberOfBytesToRead<span class="sy4">;</span> <span class="co1">//добавляем смещение к указателю на файл</span>
&nbsp; &nbsp; &nbsp; &nbsp; ovl.<span class="me1">Offset</span> <span class="sy1">=</span> ui.<span class="me1">LowPart</span><span class="sy4">;</span><span class="co1">// вносим смещение в младшее слово</span>
&nbsp; &nbsp; &nbsp; &nbsp; ovl.<span class="me1">OffsetHigh</span> <span class="sy1">=</span> ui.<span class="me1">HighPart</span><span class="sy4">;</span><span class="co1">// вносим смещение в старшеее слово</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
return0<span class="sy4">:</span>
&nbsp; &nbsp; <span class="co1">// закрываем дескрипторы, освобождаем память</span>
&nbsp; &nbsp; CloseHandle<span class="br0">&#40;</span>hFile<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; CloseHandle<span class="br0">&#40;</span>hEndRead<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw3">delete</span><span class="br0">&#91;</span><span class="br0">&#93;</span> notAlignBuf<span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw3">delete</span><span class="br0">&#91;</span><span class="br0">&#93;</span> notAlignBufWork<span class="sy4">;</span>
&nbsp;
&nbsp; &nbsp; OperOut<span class="sy2">-</span><span class="sy1">&gt;</span>xltype <span class="sy1">=</span> xltypeStr <span class="sy3">|</span> xlbitDLLFree<span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>strOut.<span class="me1">length</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy1">&gt;</span> <span class="nu0">32767</span><span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; OperOut<span class="sy2">-</span><span class="sy1">&gt;</span>val.<span class="me1">str</span> <span class="sy1">=</span> <span class="kw3">new</span> XCHAR<span class="br0">&#91;</span><span class="nu0">24</span> <span class="sy2">+</span> <span class="nu0">2</span><span class="br0">&#93;</span><span class="sy4">;</span> <span class="co1">//+1 под размер + 1 под нуль-терминатор</span>
&nbsp; &nbsp; &nbsp; &nbsp; wcscpy<span class="br0">&#40;</span>OperOut<span class="sy2">-</span><span class="sy1">&gt;</span>val.<span class="me1">str</span> <span class="sy2">+</span> <span class="nu0">1</span>, <span class="co3">L</span><span class="st0">&quot;Overflow. Max char 32767<span class="es5">\0</span>&quot;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; OperOut<span class="sy2">-</span><span class="sy1">&gt;</span>val.<span class="me1">str</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> <span class="sy1">=</span> <span class="nu0">24</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; <span class="kw1">else</span>
&nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; OperOut<span class="sy2">-</span><span class="sy1">&gt;</span>val.<span class="me1">str</span> <span class="sy1">=</span> <span class="kw3">new</span> XCHAR<span class="br0">&#91;</span>strOut.<span class="me1">length</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy2">+</span> <span class="nu0">2</span><span class="br0">&#93;</span><span class="sy4">;</span> <span class="co1">//+1 под размер + 1 под нуль-терминатор</span>
&nbsp; &nbsp; &nbsp; &nbsp; MultiByteToWideChar<span class="br0">&#40;</span>CP_ACP, MB_PRECOMPOSED, strOut.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy2">-</span><span class="nu0">1</span>, OperOut<span class="sy2">-</span><span class="sy1">&gt;</span>val.<span class="me1">str</span> <span class="sy2">+</span> <span class="nu0">1</span>, strOut.<span class="me1">length</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy2">+</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; OperOut<span class="sy2">-</span><span class="sy1">&gt;</span>val.<span class="me1">str</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> <span class="sy1">=</span> strOut.<span class="me1">length</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; <span class="kw1">return</span> OperOut<span class="sy4">;</span>
&nbsp;
return1<span class="sy4">:</span>
&nbsp; &nbsp; CloseHandle<span class="br0">&#40;</span>hFile<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; CloseHandle<span class="br0">&#40;</span>hEndRead<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw3">delete</span><span class="br0">&#91;</span><span class="br0">&#93;</span> notAlignBuf<span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw3">delete</span><span class="br0">&#91;</span><span class="br0">&#93;</span> notAlignBufWork<span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw1">return</span> OperOut<span class="sy4">;</span>
<span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div>
				   </div>
			   </div><br />
Наблюдения:<br />
1.Если рабочий файл не влезает в системный кеш, отключение кеширования положительно влияет на тайминг, если влезает кеширование серьезно ускоряет процесс (т.е. кеширование не отключаем на малых, отключаем на больших файлах).<br />
2.При документированной скорости чтения SSD - 450 Мб/с, 10 ГБ читается за 22,2 сек, что близко к скорости поиска (25,45 сек. с отключенным кешированием - 40 млн.строк, ищем последнюю).<br />
<br />
Запуск из VBA<br />
<div class="codeblock"><table class="vb"><thead><tr><td colspan="2" id="302374246"  class="head">Visual Basic</td></tr></thead><tbody><tr class="li1"><td><div id="302374246" style="height: 78px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
</pre></td><td class="de1"><pre class="de1"><span class="kw2">Sub</span> Test()
[a2] = Application.Run(<span class="st0">&quot;FindRowsInCSVansi&quot;</span>, <span class="st0">&quot;C:\CSV_10_GB.csv&quot;</span>, <span class="st0">&quot;40000000&quot;</span>, 1, 0) <span class="co1">'file 10Gb</span>
<span class="kw3">End</span> <span class="kw2">Sub</span></pre></td></tr></table></div></td></tr></tbody></table></div><br />
UPD 03/07/2020 v1.0.2.7<br />
<b>Реализация в СОМ:</b><br />
<br />
	[id(10), helpstring(&quot;Get Rows Count in CSV-file encoded ANSI&quot;)] HRESULT <b>GetRowsCountCSVansi</b>([in] BSTR <b>FileIn</b>, [in, defaultvalue(0)] LONG <b>FileFlagNoBuffering</b>, [out, retval] LONG* <b>RowsCountOut</b>);<br />
<br />
	[id(11), helpstring(&quot;Get Row by index in CSV-file encoded ANSI&quot;)] HRESULT <b><b>GetRowCSVansi</b></b>([in] BSTR <b>FileIn</b>, [in]  LONG <b>IndexString</b>, [in, defaultvalue(0)] LONG <b>FileFlagNoBuffering</b>, [out, retval] BSTR* <b>StringOut</b>);<br />
<br />
	[id(12), helpstring(&quot;Find Rows/String by substring in CSV-file encoded ANSI&quot;)] HRESULT <b>FindRowsInCSVansi</b>([in] BSTR <b>FileIn</b>, [in] BSTR <b>FindString</b>, [in, defaultvalue(0)]  LONG <b>MultiLine</b>, [in, defaultvalue(0)] LONG <b>FileFlagNoBuffering</b>, [out, retval] BSTR* <b>StringOut</b>);<br />
<br />
<br />
Запуск из VBA<br />
<div class="codeblock"><table class="vb"><thead><tr><td colspan="2" id="500940766"  class="head">Visual Basic</td></tr></thead><tbody><tr class="li1"><td><div id="500940766" style="height: 78px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
</pre></td><td class="de1"><pre class="de1"><span class="kw2">Sub</span> Test()
[a2] = <span class="kw2">CreateObject</span>(<span class="st0">&quot;BedvitCOM.VBA&quot;</span>).FindRowsInCSVansi(<span class="st0">&quot;C:\CSV_1_GB.csv&quot;</span>, <span class="st0">&quot;4000000&quot;</span>, 0, 0) <span class="co1">'file 1Gb</span>
<span class="kw3">End</span> <span class="kw2">Sub</span></pre></td></tr></table></div></td></tr></tbody></table></div><a href="https://www.cyberforum.ru/blogs/829006/blog5958.html">Последние версии библиотек.</a></div>


<!-- attachments -->
	<div style="margin-top:10px">

		
			<fieldset class="fieldset">
				<legend>Миниатюры</legend>
				<div style="padding:3px">
				
	<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=6293&amp;d=1591474579" target="attachment" rel="Lightbox" id="attachment6293"><img loading="lazy" decoding="async" class="thumbnail" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=6293&amp;stc=1&amp;thumb=1&amp;d=1591474579" border="0" alt="Нажмите на изображение для увеличения
Название: FindRowsInCSVansi.PNG
Просмотров: 851
Размер:	24.2 Кб
ID:	6293" /></a>
	&nbsp;
	

				</div>
			</fieldset>
		
		
		
		

	</div>
<!-- / attachments -->
]]></content:encoded>
			<dc:creator>bedvit</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/829006/6617.html</guid>
		</item>
		<item>
			<title>Печать QR-кода в COM/ActiveX и в Excel</title>
			<link>https://www.cyberforum.ru/blogs/829006/6514.html</link>
			<pubDate>Wed, 22 Apr 2020 20:56:43 GMT</pubDate>
			<description>*Печать QR-кода в Excel, Word, 1С и проч. приложениях с поддержкой COM/ActiveX.* 
Часть библиотеки...</description>
			<content:encoded><![CDATA[<div><b>Печать QR-кода в Excel, Word, 1С и проч. приложениях с поддержкой COM/ActiveX.</b><br />
Часть библиотеки <a href="https://www.cyberforum.ru/blogs/829006/blog5958.html">BedvitCOM</a><br />
Использованы: <b><a rel="nofollow noopener noreferrer" href="https://fukuchi.org/works/qrencode/" target="_blank" title="https://fukuchi.org/works/qrencode/">libqrencode</a> + GDI+</b><br />
<br />
Страницы на сайте: <a rel="nofollow noopener noreferrer" href="https://bedvit.ru/xll/qr/" target="_blank" title="https://bedvit.ru/xll/qr/">https://bedvit.ru/xll/qr/</a><br />
Страницы на сайте: <a rel="nofollow noopener noreferrer" href="https://bedvit.ru/com/qr/" target="_blank" title="https://bedvit.ru/com/qr/">https://bedvit.ru/com/qr/</a><br />
<br />
Функционал:<br />
1. Сохранение изображения в форматы: <b>bmp, jpeg, gif, tiff, png.</b><br />
2. QR-кода сохраняется в монохромное изображение, где формат позволяет, т.е. до <b>1 бита на пиксель</b>. В любом цвете RGB. К примеру размер .PNG 1140*1140 пикселей (1 бит на пиксель) - 2КБ.<br />
3. Возможность <b>задавать размер модуля</b> (пикселя QR).<br />
4. Возможность<b> задавать цвет в RGB.</b><br />
5. Возможность <b>задавать версию</b> QR кода.<br />
6. Возможность задавать <b>уровень коррекции ошибок</b>.<br />
7. Возможность изменить толщину рамки - quiet zone (начиная с v1.0.4.8)<br />
8. Емкость QR-кода составляет до 7000 цифр или 4000 символов<br />
9. (Отдельно) Конвертации вышеперечисленных форматов из одного в другой<br />
<br />
Параметры/Аргументы функции <b>QRcodePrint</b> :<br />
1. QRcodeText - что печатаем, строка(обязательное).<br />
2. FileOut - куда печатаем, полное имя файла <s>(обязательное)</s>. Начиная с версии библ. v1.0.4.0 - не обязательное, по умолчанию используется пользовательский &quot;TEMP&quot; + уникальное имя файла (GUID). Расширение теперь добавляется автоматически, если оно не указано. Если указан файл без папок - файл помещается в ту же папку, где располагается зарегистрированная библиотека.<br />
3. FormatImageOut -  формат изображения (код в функции/формат):0 (bmp), 1 (jpeg), 2 (gif), 3 (tiff), 4 (png)-по умолчанию. (этот и остальные аргументы не обязательны)<br />
4. SizePixel - размер пикселя (модуля), по умолчанию 4 (минимально рекомендуемый)<br />
5. PixelColorR =0 цвет RGB если хотим цветную картинку (по умолчанию черный)<br />
6. PixelColorG = 0<br />
7. PixelColorB =0<br />
8. VersionSymbol - версия QR кода (1-40) (по умолчанию = 0-выбор автоматом)<br />
9. LevelErrCorrect - уровень коррекции ошибок (0-3, по умолчанию = 1  ~15%)<br />
10. QuietZone - Размер в модулях зоны тишины (&gt;=0, по умолчанию = 4).  Quiet zone — это область, отделяющая границу штрих-кода от фона и других изображений. Начиная с v1.0.4.8<br />
11.<s> Возвращает код ошибки, 0 - все штатно.</s> Начиная с версии библ. v1.0.4.0 - при удаче, возвращается полное имя файла созданного изображения, при неудаче выводится ошибка и возвращается &quot;Empty&quot;<br />
<br />
Добавил отдельный метод (<b>ConvertFormatImage</b>) конвертации вышеперечисленных форматов из одного в другой.<br />
В случаях конвертации сторонних изображений.<br />
Параметры/Аргументы метода <b>ConvertFormatImage</b> :<br />
1. FileIn -  полное имя файла (обязательное).<br />
2. FileOut -  полное имя файла (обязательное).<br />
3. FormatImageOut - нужный формат (обязательное). Код в функции/формат:0 (bmp), 1 (jpeg), 2 (gif), 3 (tiff), 4 (png)<br />
<br />
Пример <b>использования:<br />
1. Excel</b> - открываем или устанавливаем <b><a href="https://www.cyberforum.ru/blogs/829006/blog5958.html">xll</a></b> как надстройку нужной разрядности (Excel), пишем код:<br />
<div class="codeblock"><table class="vb"><thead><tr><td colspan="2" id="628393413"  class="head">Visual Basic</td></tr></thead><tbody><tr class="li1"><td><div id="628393413" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="de1"><pre class="de1"><span class="kw2">Option</span> <span class="kw2">Explicit</span>
&nbsp;
<span class="kw2">Sub</span> QR_Generate()
&nbsp; &nbsp; <span class="kw4">Dim</span> bVBA <span class="kw4">As</span> <span class="kw1">Object</span>: <span class="kw4">Set</span> bVBA = <span class="kw2">CreateObject</span>(<span class="st0">&quot;BedvitCOM.VBA&quot;</span>) &nbsp;<span class="co1">'позднее связывание</span>
 &nbsp; &nbsp;<span class="kw4">Dim</span> fileName <span class="kw4">As</span> <span class="kw1">String</span>: fileName = Environ(<span class="st0">&quot;Temp&quot;</span>) &amp; <span class="st0">&quot;\QR.png&quot;</span> <span class="co1">'печать QR в файл (в пользовательский Temp)</span>
 &nbsp; &nbsp;<span class="kw4">Dim</span> convertToFile <span class="kw4">As</span> <span class="kw1">String</span>: convertToFile = Environ(<span class="st0">&quot;Temp&quot;</span>) &amp; <span class="st0">&quot;\QR.tif&quot;</span>
&nbsp; &nbsp; <span class="kw4">Dim</span> QRcodeText <span class="kw4">As</span> <span class="kw1">String</span>: QRcodeText = <span class="st0">&quot;https://www.cyberforum.ru/blogs/829006/blog6514.html&quot;</span>
&nbsp;
&nbsp; &nbsp; <span class="kw4">Dim</span> resultFileName <span class="kw4">As</span> <span class="kw1">String</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">'печать QR в файл (в пользовательский Temp) и вывести на лист Excel</span>
 &nbsp; &nbsp;resultFileName = bVBA.QRcodePrint(QRcodeText, fileName) &nbsp;<span class="co1">'с аргументами по умолчанию</span>
 &nbsp; &nbsp;ActiveSheet.Shapes.AddPicture resultFileName, <span class="kw5">False</span>, <span class="kw5">True</span>, 0, 0, -1, -1
&nbsp;
&nbsp; &nbsp; resultFileName = bVBA.QRcodePrint(QRcodeText, fileName, 4, 4, 255, 0, 0, 0, 1, 4) <span class="co1">'с нужными аргументами</span>
 &nbsp; &nbsp;ActiveSheet.Shapes.AddPicture resultFileName, <span class="kw5">False</span>, <span class="kw5">True</span>, 200, 0, -1, -1
&nbsp;
&nbsp; &nbsp; &nbsp;<span class="co1">'Конвертировать формат изображения</span>
 &nbsp; &nbsp;bVBA.ConvertFormatImage fileName, convertToFile, 3 &nbsp;<span class="co1">'формат (tiff), см. в описании</span>
<span class="kw3">End</span> <span class="kw2">Sub</span></pre></td></tr></table></div></td></tr></tbody></table></div>В одну строку:<br />
<div class="codeblock"><table class="vb"><thead><tr><td colspan="2" id="24793071"  class="head">Visual Basic</td></tr></thead><tbody><tr class="li1"><td><div id="24793071" style="height: 78px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
</pre></td><td class="de1"><pre class="de1"><span class="kw2">Sub</span> QR_Generate_Fast()
&nbsp; &nbsp; ActiveSheet.Shapes.AddPicture <span class="kw2">CreateObject</span>(<span class="st0">&quot;BedvitCOM.VBA&quot;</span>).QRcodePrint(<span class="st0">&quot;Здесь инфо для печати&quot;</span>, Environ(<span class="st0">&quot;Temp&quot;</span>) &amp; <span class="st0">&quot;\QR.png&quot;</span>), <span class="kw5">False</span>, <span class="kw5">True</span>, 0, 0, -1, -1
<span class="kw3">End</span> <span class="kw2">Sub</span></pre></td></tr></table></div></td></tr></tbody></table></div>2. <b>1C</b> - регистрируем <b>COM</b> нужной разрядности (можно под пользователем), далее код (по аналогии с Excel)<br />
<br />
<a href="https://www.cyberforum.ru/blogs/829006/blog5958.html">Последние версии библиотек.</a><br />
<br />
<br />
<b><font color="Blue"><b>UPD: 20/04/2021 </b><br />
Теперь и как функция <b>Excel </b>- <b>QRcodePrint</b></font></b><br />
<iframe width="640" height="360" src="https://www.youtube.com/embed/P-swDT_VeAY" frameborder="0" allowfullscreen></iframe><br />
Параметры/Аргументы функции QRcodePrint :<br />
1. QRcodeText - что печатаем, строка(обязательное).<br />
2. SizePixel - размер пикселя (не картинки, а квадратика в QR), по умолчанию 4 (минимально рекомендуемый)<br />
3. PixelColorR =0 цвет RGB (0-255) если хотим цветную картинку (по умолчанию черный)<br />
4. PixelColorG = 0<br />
5. PixelColorB =0<br />
6. VersionSymbol - версия QR кода (1-40) (по умолчанию = 0-выбор автоматом), см. ниже<br />
7. LevelErrCorrect - уровень коррекции ошибок (0-3, по умолчанию = 1 ~15%), см. ниже<br />
8.WidthImage - постоянная ширина (т.к. при кодировании разного размера данных размер QR меняется). Если хотим постоянный размер  - проставляем. По умолчанию &quot;-1&quot; (размер фактический)<br />
9.HeightImage - постоянная высота, тоже, что и п.8<br />
10. QuietZone - Размер в модулях зоны тишины (&gt;=0, по умолчанию = 4). Quiet zone — это область, отделяющая границу штрих-кода от фона и других изображений. Начиная с версии xll - v2.0.1.6<br />
11.Left - отступ от левого верхнего угла ячейки с функцией (рекомендуется оставлять значение по умолчанию = 0)<br />
12.Top - тоже, что и п.11 (рекомендуется оставлять значение по умолчанию = 0)<br />
п.11,12 рекомендовано использовать, только тогда, когда есть понимание, как это все работает (см.ниже). В обратном случае может быть ситуация, когда изменили размер ячейки или изменили 11 и/или 12 параметр, и теперь QR - печатается в другой ячейке, а в предыдущей он уже не удалится, останется до ручного удаления.<br />
<b>Результат</b>: При удаче, <b>возвращается закодированная в QR-коде строка</b>, при ошибке - &quot;#ЧИСЛО!&quot;<br />
<b>Важно</b>: Ячейка <b>в которую</b> помещается QR-код <b>предварительно очищается</b> от старых версий QR.<br />
Если <b>QR-код больше не нужен</b> можно удалить вручную или<b> задать пустую строку для первого параметра</b> функции (старый QR-код удалится, новый не создастся). Важно! QR-код при этом должен находится (его левый верхний угол)  в рамках ячейки, в которой находится функция QRcodePrint(), в противном случай картинка не удалится.</div>


<!-- attachments -->
	<div style="margin-top:10px">

		
		
			<fieldset class="fieldset">
				<legend>Изображения</legend>
				<div style="padding:3px">
				<img loading="lazy" decoding="async" class="attach" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=6160&amp;stc=1&amp;d=1587588401" border="0" alt="" />&nbsp;
				</div>
			</fieldset>
		
		
		

	</div>
<!-- / attachments -->
]]></content:encoded>
			<dc:creator>bedvit</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/829006/6514.html</guid>
		</item>
		<item>
			<title>Библиотека COM (OLE Automation). Часть 2 - ArraySort (Variant)</title>
			<link>https://www.cyberforum.ru/blogs/829006/5983.html</link>
			<pubDate>Mon, 26 Aug 2019 13:35:14 GMT</pubDate>
			<description>Часть библиотеки BedvitCOM (https://www.cyberforum.ru/blogs/829006/blog5958.html)  
...и...</description>
			<content:encoded><![CDATA[<div>Часть библиотеки <a href="https://www.cyberforum.ru/blogs/829006/blog5958.html">BedvitCOM</a> <br />
...и продолжение темы <a href="https://www.cyberforum.ru/blogs/829006/blog5534.html">Библиотека COM (OLE Automation). Часть 1 - ArraySort (String)</a><br />
<br />
В классе <b>&quot;VBA&quot;</b> добавил новый метод <b>&quot;ArraySortV&quot;</b> - сортировка <b>любого</b> типа данных.<br />
Метод <b>&quot;ArraySort&quot; переименован в &quot;ArraySortS&quot;.</b><br />
Функционал:<b> &quot;ArraySortS&quot; </b>- сортировка данных (String) в одномерном/двухмерном массиве. <br />
<b>&quot;ArraySortV&quot;</b> - сортировка данных (Variant) в одномерном/двухмерном массиве. <br />
Использованы <b><a rel="nofollow noopener noreferrer" href="https://learn.microsoft.com/ru-RU/cpp/parallel/concrt/parallel-algorithms?view=msvc-140" target="_blank" title="https://learn.microsoft.com/ru-RU/cpp/parallel/concrt/parallel-algorithms?view=msvc-140">параллельные алгоритмы сортировки</a></b>. (библиотеки PPL от Мicrosoft)<br />
<br />
Интерфейс метода:<br />
<div class="codeblock"><table class="cpp"><thead><tr><td colspan="2" id="861149215"  class="head">C++</td></tr></thead><tbody><tr class="li1"><td><div id="861149215" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1">&nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span><span class="nu0">7</span><span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;Array sort (Variant)&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span> HRESULT ArraySortV<span class="br0">&#40;</span><span class="br0">&#91;</span>in, out<span class="br0">&#93;</span> VARIANT<span class="sy2">*</span> array_in_out, <span class="br0">&#91;</span>in, defaultvalue<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#93;</span> LONG key_1, <span class="br0">&#91;</span>in, defaultvalue<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#93;</span> VARIANT_BOOL sort_order1, <span class="br0">&#91;</span>in, defaultvalue<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#93;</span> LONG key_2, <span class="br0">&#91;</span>in, defaultvalue<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#93;</span> VARIANT_BOOL sort_order2, <span class="br0">&#91;</span>in, defaultvalue<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#93;</span> LONG key_3, <span class="br0">&#91;</span>in, defaultvalue<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#93;</span> VARIANT_BOOL sort_order3, <span class="br0">&#91;</span>in, defaultvalue<span class="br0">&#40;</span><span class="co3">L</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span> BSTR key_and_sort_order_next<span class="br0">&#41;</span><span class="sy4">;</span></pre></td></tr></table></div></td></tr></tbody></table></div>Параметры метода:<br />
1.<b>array_in_out</b> - указатель на массив (ввод/вывод)<br />
2.<b>key_1</b> - ключи сортировки (порядковый номер столбца, начиная с 1), по умолчанию - первый столбец.<br />
3.<b>sort_order1</b> - порядок сортировки для  key_1 : 0-по возрастанию (по умолчанию для всех), 1-по убыванию<br />
4.<b>key_2</b> - по умолчанию - не участвует<br />
5.<b>sort_order2</b> - порядок сортировки для  key_2 <br />
6.<b>key_3</b> - по умолчанию - не участвует<br />
7.<b>sort_order3</b> - порядок сортировки для  key_3 <br />
Ключи задаются по порядку, т.е. сразу указать 3й - нельзя.<br />
<font color="Blue">Начиная с версии<b> 1.0.5.3 </b><br />
8.<b>key_and_sort_order_next</b> - дает возможность отсортировать любое количество полей с индивидуальным порядком сортировки для каждого. Задается текстовой строкой, в том же формате, как и первые 3 параметра (&quot;номер столбца, порядок сортировки&quot; - пример: &quot;4, 0, 5, 0, ...&quot;). Тестовый пример см. ниже. </font><br />
<br />
Примеры использования на VBA и сравнение с предыдущем методом:<br />
<div class="codeblock"><table class="vb"><thead><tr><td colspan="2" id="179752645"  class="head">Visual Basic</td></tr></thead><tbody><tr class="li1"><td><div id="179752645" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
</pre></td><td class="de1"><pre class="de1"><span class="kw2">Sub</span> Test_arr_sort()
<span class="co1">'Dim a As BedvitCOM.VBA: Set a = New BedvitCOM.VBA 'ранее связывание</span>
<span class="kw4">Dim</span> bVBA <span class="kw4">As</span> <span class="kw1">Object</span>: <span class="kw4">Set</span> bVBA = <span class="kw2">CreateObject</span>(<span class="st0">&quot;BedvitCOM.VBA&quot;</span>) <span class="co1">'позднее связывание</span>
<span class="kw4">Dim</span> testSize <span class="kw4">As</span> <span class="kw1">Long</span>: testSize = 2000000
<span class="kw4">Dim</span> i, t, arrTmpV
&nbsp;
<span class="kw4">Dim</span> ArrS: <span class="kw4">ReDim</span> ArrS(0 <span class="kw3">To</span> testSize) <span class="kw4">As</span> <span class="kw1">String</span>
<span class="kw4">Dim</span> ArrV1: <span class="kw4">ReDim</span> ArrV1(0 <span class="kw3">To</span> testSize)
<span class="kw4">Dim</span> ArrV2: <span class="kw4">ReDim</span> ArrV2(0 <span class="kw3">To</span> testSize, 0 <span class="kw3">To</span> 3)
&nbsp;
<span class="kw3">For</span> i = 0 <span class="kw3">To</span> testSize
&nbsp; &nbsp; ArrS(i) = Format$(Int(Rnd * 1000), <span class="st0">&quot;0000&quot;</span>)
&nbsp; &nbsp; ArrV1(i) = Format$(Int(Rnd * 1000), <span class="st0">&quot;0000&quot;</span>)
&nbsp; &nbsp; ArrV2(i, 0) = Format$(Int(Rnd * 1000), <span class="st0">&quot;0000&quot;</span>)
&nbsp; &nbsp; ArrV2(i, 1) = Format$(Int(Rnd * 1000), <span class="st0">&quot;0000&quot;</span>)
&nbsp; &nbsp; ArrV2(i, 2) = Format$(Int(Rnd * 1000), <span class="st0">&quot;0000&quot;</span>)
<span class="kw3">Next</span>
&nbsp;
<span class="co1">'0й способ по 1х массиву STRING</span>
t = Timer
bVBA.ArraySortS ArrS
Debug.<span class="kw4">Print</span> <span class="st0">&quot;Простая сорт. STRING 1х массива, по возрастанию (по умолч.): &quot;</span> &amp; Timer - t &amp; <span class="st0">&quot; сек.&quot;</span>
&nbsp;
<span class="co1">'1й способ по 1х массиву VARIANT</span>
t = Timer
bVBA.ArraySortV ArrV1
Debug.<span class="kw4">Print</span> <span class="st0">&quot;Простая сорт. VARIANT 1х массива, по возрастанию (по умолч.): &quot;</span> &amp; Timer - t &amp; <span class="st0">&quot; сек.&quot;</span>
&nbsp;
<span class="co1">'2й способ по 2х массиву VARIANT</span>
arrTmpV = ArrV2
t = Timer
bVBA.ArraySortV arrTmpV
Debug.<span class="kw4">Print</span> <span class="st0">&quot;Простая сорт. VARIANT 2х массива, по возрастанию (по умолч.): &quot;</span> &amp; Timer - t &amp; <span class="st0">&quot; сек.&quot;</span>
&nbsp;
<span class="co1">'3й способ по 2х массиву VARIANT, по двум полям</span>
arrTmpV = ArrV2
t = Timer
bVBA.ArraySortV arrTmpV, 1, 1, 2, 0
Debug.<span class="kw4">Print</span> <span class="st0">&quot;Простая сорт. VARIANT 2х массива, по убыванию по первому ключу и по возрастанию по второму: &quot;</span> &amp; Timer - t &amp; <span class="st0">&quot; сек.&quot;</span>
&nbsp;
<span class="co1">'4й способ по 2х массиву VARIANT, по двум полям</span>
arrTmpV = ArrV2
t = Timer
bVBA.ArraySortV arrTmpV, 1, 0, 2, 0, 3, 0
Debug.<span class="kw4">Print</span> <span class="st0">&quot;Простая сорт. VARIANT 2х массива, по возрастанию по трём ключам: &quot;</span> &amp; Timer - t &amp; <span class="st0">&quot; сек.&quot;</span>
&nbsp;
<span class="co1">'5й способ - данные с листа</span>
arrTmpV = [a1:c200]
t = Timer
bVBA.ArraySortV arrTmpV, 1, 1, 3, 1
Debug.<span class="kw4">Print</span> <span class="st0">&quot;Простая сорт. VARIANT 2х массива, по убыванию, по первому столбцу и третьему: &quot;</span> &amp; Timer - t &amp; <span class="st0">&quot; сек.&quot;</span>
[d1:f200] = arrTmpV
&nbsp;
<span class="kw3">End</span> <span class="kw2">Sub</span></pre></td></tr></table></div></td></tr></tbody></table></div>Результаты на 2 млн. строк (тестовый стенд: ЦП-QuadCore Intel Core i7-3770, ОЗУ-16ГБ (DDR3-1600 DDR3 SDRAM), WIN7x64, MS Office2016x64):<br />
Простая сорт. STRING 1х массива, по возрастанию (по умолч.): 0,2109375 сек.<br />
Простая сорт. VARIANT 1х массива, по возрастанию (по умолч.): 0,2539063 сек.<br />
Простая сорт. VARIANT 2х массива, по возрастанию (по умолч.): 0,4960938 сек.<br />
Простая сорт. VARIANT 2х массива, по убыванию по первому ключу и по возрастанию по второму: 0,9101563 сек.<br />
Простая сорт. VARIANT 2х массива, по возрастанию по трём ключам: 1,0625 сек.<br />
<br />
Видно, что VARIANT незначительно отстает от STRING.<br />
<br />
<font color="Blue"><b>Update: 11/12/2021 - v1.0.5.3</b><br />
Начиная с версии<b> 1.0.5.3 </b> сортировка по любому количеству полей с индивидуальным порядком сортировки для каждого.</font><br />
<div class="codeblock"><table class="vb"><thead><tr><td colspan="2" id="404301472"  class="head">Visual Basic</td></tr></thead><tbody><tr class="li1"><td><div id="404301472" style="height: 334px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td class="de1"><pre class="de1"><span class="kw2">Sub</span> Test_arr_sort_10_key()
<span class="co1">'Dim a As BedvitCOM.VBA: Set a = New BedvitCOM.VBA 'ранее связывание</span>
<span class="kw4">Dim</span> bVBA <span class="kw4">As</span> <span class="kw1">Object</span>: <span class="kw4">Set</span> bVBA = <span class="kw2">CreateObject</span>(<span class="st0">&quot;BedvitCOM.VBA&quot;</span>) <span class="co1">'позднее связывание</span>
<span class="kw4">Dim</span> i, j, t, testSize <span class="kw4">As</span> <span class="kw1">Long</span>: testSize = 1000000
&nbsp;
<span class="kw4">Dim</span> ArrV: <span class="kw4">ReDim</span> ArrV(0 <span class="kw3">To</span> testSize, 0 <span class="kw3">To</span> 9)
&nbsp;
<span class="kw3">For</span> i = 0 <span class="kw3">To</span> testSize
&nbsp; &nbsp; <span class="kw3">For</span> j = 0 <span class="kw3">To</span> 9
&nbsp; &nbsp; ArrV(i, j) = CLng(Rnd * 2)
&nbsp; &nbsp; <span class="kw3">Next</span>
<span class="kw3">Next</span>
&nbsp;
t = Timer
bVBA.ArraySortV ArrV, 1, 0, 2, 0, 3, 0, <span class="st0">&quot;4, 0, 5, 0, 6, 0, 7, 0, 8, 0, 9, 0, 10, 0&quot;</span>
Debug.<span class="kw4">Print</span> <span class="st0">&quot;Cортировка VARIANT 2х массива, по возрастанию по 10 ключам: &quot;</span> &amp; Timer - t &amp; <span class="st0">&quot; сек.&quot;</span>
[a1:j1000000] = ArrV
&nbsp;
<span class="kw3">End</span> <span class="kw2">Sub</span></pre></td></tr></table></div></td></tr></tbody></table></div><br />
<a href="https://www.cyberforum.ru/blogs/829006/blog5958.html">Последние версии библиотек.</a></div>


<!-- attachments -->
	<div style="margin-top:10px">

		
			<fieldset class="fieldset">
				<legend>Миниатюры</legend>
				<div style="padding:3px">
				
	<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=5524&amp;d=1566915929" target="attachment" rel="Lightbox" id="attachment5524"><img loading="lazy" decoding="async" class="thumbnail" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=5524&amp;stc=1&amp;thumb=1&amp;d=1566915929" border="0" alt="Нажмите на изображение для увеличения
Название: BedvitCOM_VBA2.PNG
Просмотров: 581
Размер:	88.5 Кб
ID:	5524" /></a>
	&nbsp;
	

				</div>
			</fieldset>
		
		
		
		

	</div>
<!-- / attachments -->
]]></content:encoded>
			<dc:creator>bedvit</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/829006/5983.html</guid>
		</item>
		<item>
			<title>BedvitCOM (библиотека COM/ActiveX) + BedvitXLL (библиотека XLL c C API Functions для Excel) С/С++</title>
			<link>https://www.cyberforum.ru/blogs/829006/5958.html</link>
			<pubDate>Tue, 06 Aug 2019 15:48:38 GMT</pubDate>
			<description>Решил объединить все проекты по данной тематике в одно решение. 
*Скачать новые версии библиотек...</description>
			<content:encoded><![CDATA[<div>Решил объединить все проекты по данной тематике в одно решение.<br />
<b>Скачать новые версии библиотек <a rel="nofollow noopener noreferrer" href="http://bedvit.ru/xll/" target="_blank" title="http://bedvit.ru/xll/">XLL</a> и <a rel="nofollow noopener noreferrer" href="http://bedvit.ru/com/" target="_blank" title="http://bedvit.ru/com/">COM</a> на <a rel="nofollow noopener noreferrer" href="http://bedvit.ru/" target="_blank" title="http://bedvit.ru/">сайте</a>.<br />
</b><br />
Более подробно по компонентам - в отдельных темах (будут линки).<br />
<br />
<font color="DarkRed"><u><b>1.BedvitCOM (библиотека COM/ActiveX)</b></u></font><br />
<br />
Область применения - <b>COM/ActiveX</b> поддерживающие приложения/языки на <b>Windows</b> (х32, х64).<br />
Реализованы dual-интерфейсы с Automation-совместимыми типами данных (поддержка раннего и позднего связывания).<br />
При раннем связывании есть описание функционала и параметров.<br />
<b>Регистрация COM</b> реализовано как под админом, так и под <b>пользователем </b>(актуально в офисной части клиентов)<br />
Регистрация стандартная:<br />
Админ: <b>Regsvr32 &quot;FullName.DLL&quot;</b> !ПОМНИМ! В Win10 регистрация под правами админа: &quot;правая кнопка&quot; - &quot;Пуск&quot; -&quot;Командная строка (администратор)&quot;<br />
Пользователь: <b>Regsvr32 /i /n &quot;FullName.DLL&quot;</b><br />
Удалить из реестра: <b>Regsvr32 /u &quot;FullName.DLL&quot;</b><br />
<br />
<b><font color="Blue">Примеры использования:</font></b><br />

			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   <font color="blue">Раннее связывание</font><br />
<div class="codeblock"><table class="vb"><thead><tr><td colspan="2" id="736142134"  class="head">Visual Basic</td></tr></thead><tbody><tr class="li1"><td><div id="736142134" style="height: 94px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
</pre></td><td class="de1"><pre class="de1"><span class="kw2">Sub</span> Help()
<span class="kw4">Dim</span> bCOM <span class="kw4">As</span> <span class="kw2">New</span> BedvitCOM.BignumArithmeticFloat
bCOM.Help
<span class="kw3">End</span> <span class="kw2">Sub</span></pre></td></tr></table></div></td></tr></tbody></table></div><font color="blue">Позднее связывание</font><div class="codeblock"><table class="vb"><thead><tr><td colspan="2" id="118568803"  class="head">Visual Basic</td></tr></thead><tbody><tr class="li1"><td><div id="118568803" style="height: 142px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
</pre></td><td class="de1"><pre class="de1"><span class="kw2">Sub</span> Help()
<span class="kw4">Dim</span> bCOM
<span class="kw4">Set</span> bCOM = <span class="kw2">CreateObject</span>(<span class="st0">&quot;BedvitCOM.BignumArithmeticFloat&quot;</span>)
bCOM.Help
<span class="co1">'или в одну строку</span>
<span class="kw2">CreateObject</span>(<span class="st0">&quot;BedvitCOM.BignumArithmeticFloat&quot;</span>).Help
<span class="kw3">End</span> <span class="kw2">Sub</span></pre></td></tr></table></div></td></tr></tbody></table></div><div class="codeblock"><table class="_1c"><thead><tr><td colspan="2" id="674942796"  class="head">1C</td></tr></thead><tbody><tr class="li1"><td><div id="674942796" style="height: 62px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
</pre></td><td class="de1"><pre class="de1">bCOM <span class="sy0">=</span> Новый COMОбъект<span class="br0">&#40;</span><span class="st0">&quot;BedvitCOM.BignumArithmeticFloat&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
bCOM<span class="sy0">.</span><span class="me1">Help</span><span class="sy0">;</span></pre></td></tr></table></div></td></tr></tbody></table></div>
				   </div>
			   </div><br />
<br />
<br />
Содержит:<br />
<b>1. Класс <a href="https://www.cyberforum.ru/blogs/829006/blog5196.html">BignumArithmeticInteger</a> - длинная арифметика с целыми числами.</b><br />

			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   Свойства и Методы BignumArithmeticInteger<br />
<br />
1.Help(); HTML Справка (без параметров).<br />
<br />
2.BSTR* StringBSTR = Bignum(BYTE Bignum, LONG BignumBase=10) = BSTR* StringBSTR ; Свойство. Принимает и возвращает BSTR* строку StringBSTR (задает число или возвращает значение). Bignum-индекс длинного числа в массиве (0-255). BignumBase-база длинного числа (от 2 до 36), по умолчанию = 10.<br />
<br />
3.LONG Val = Sign(BYTE Bignum); Свойство. Возвращает знак длинного числа LONG Val.Возвращает 1 если Bignum &gt; 0, 0 если Bignum = 0, и -1 если Bignum &lt; 0.<br />
<br />
4.LONG Val = Even(BYTE Bignum); Свойство. Определяет, является ли Bignum четное или нечетное. Возвращает 1 - Bignum четное, 0 - Bignum нечетное.<br />
<br />
5.LONG Val = Compare(BYTE Bignum1, BYTE Bignum2); Метод. Сравнивает два длинных числа. Возвращает 1 если Bignum1 &gt; Bignum2, 0 если Bignum1 = Bignum2, и -1 если Bignum1 &lt; Bignum2.<br />
<br />
6.BignumSet(BYTE Bignum, BSTR StringBSTR, LONG BignumBase=10); Метод. Задает число с параметрами аналогичными свойству Bignum()<br />
<br />
7.Sum(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Суммирует два длинных числа. BignumSet = Bignum1 + Bignum2<br />
<br />
8.SumL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Суммирует длинное число с обычным. BignumSet = Bignum1 + LONG_PTR(х64:LONG_PTR= LONGLONG, х32:LONG_PTR= LONG) <br />
<br />
9.Abs(BYTE BignumSet, BYTE Bignum1); Метод. Возвращает модуль значения из Bignum1 в BignumSet.<br />
<br />
10.Negate(BYTE BignumSet, BYTE Bignum1); Метод. Возвращает значение с противоположным знаком из Bignum1 в BignumSet. BignumSet = - Bignum1.<br />
<br />
11.Subtract(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Вычитает из одного длинного числа второе. BignumSet = Bignum1 - Bignum2<br />
<br />
12.SubtractL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Вычитает из длинного числа обычное. BignumSet = Bignum1 - LONG_PTR.<br />
<br />
13.Multiply(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Умножает одно длинное число на второе. BignumSet = Bignum1 * Bignum2.<br />
<br />
14.MultiplyL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Умножает длинное число на обычное. BignumSet = Bignum1 * LONG_PTR.<br />
<br />
15.Divide(BYTE BignumQuotient, BYTE BignumRemainder, BYTE Bignum1, BYTE Bignum2); Метод. Делит одно длинное число на второе. При делении получаем частное в BignumQuotient, остаток от деления в BignumRemainder = Bignum1 / Bignum2.<br />
<br />
16.DivideL(BYTE BignumQuotient, BYTE BignumRemainder, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Делит длинное число на обычное. При делении получаем частное в BignumQuotient, остаток от деления в BignumRemainder = Bignum1 / LONG_PTR.<br />
<br />
17.Power(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Возводит в степень LONG_PTR длинное число Bignum1, результат возвращает в BignumSet. BignumSet = Bignum1 ^ LONG_PTR.<br />
<br />
18.Clone(BYTE BignumSet, BYTE Bignum1); Метод. Копирует Bignum1 в BignumSet. BignumSet = Bignum1<br />
<br />
19.RootRem(BYTE BignumRoot, BYTE BignumRemainder, BYTE Bignum1, LONG_PTR n_root); Метод. Извлекает корень n_root-степени из Bignum1. Целочисленный результат возвращает в BignumRoot, остаток в BignumRemainder = (n-th root)√ Bignum1.<br />
<br />
20.Factorial(BYTE BignumSet, LONG n); Метод. Возвращает в BignumSet факториал n!<br />
<br />
21.Fibonacci(BYTE BignumSet, LONG_PTR n); Метод. Возвращает в BignumSet число Фибоначи n. Fn+1 = Fn + Fn-1<br />
<br />
22.LucNum(BYTE BignumSet, LONG_PTR n); Метод. Возвращает в BignumSet число Лукоса n. Ln+1 =Ln + Ln-1<br />
<br />
23.FileSet(BYTE Bignum, BSTR StringBSTRFileName, LONG BignumBase=10); Метод. Загружает длинное число из файла (*.txt). Принимает BSTR* строку StringBSTRFileName в качестве полного пути и имени файла. Bignum-индекс длинного числа в массиве (0-255). BignumBase-база числа (от 2 до 36), по умолчанию = 10.<br />
<br />
24.FileGet(BYTE Bignum, BSTR StringBSTRFileName, LONG BignumBase=10); Метод. Сохраняет длинное число в файл (*.txt). Принимает BSTR* строку StringBSTRFileName в качестве полного пути и имени файла. Bignum-индекс длинного числа в массиве (0-255). BignumBase-база числа (от 2 до 36), по умолчанию = 10.<br />
<br />
25.Clear(LONG Bignum=-1); Метод. Освобождает память занятую длинным числом Bignum, или освобождает память занятую всеми числами при заданном параметре по умолчанию = -1. Начиная с v2.0.0.0 деструктор класса сам очищает память (при удалении класса или завершении процедуры в VBA).<br />
<br />
26.LONG Val = BignumArraySize(); Метод. Возвращает количество чисел Bignum в созданном классе/массиве. Начиная с v2.0.0.0 (теперь массив чисел может быть произвольного размера, а не как ранее 256 чисел. Размер увеличиваться автоматически.)<br />
<br />

				   </div>
			   </div><br />
<br />
<b>2. Класс <a href="https://www.cyberforum.ru/blogs/829006/blog5196.html">BignumArithmeticFloat</a> - длинная арифметика с дробными числами.</b><br />

			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   Свойства и Методы BignumArithmeticFloat<br />
<br />
1.Help(); HTML Справка (без параметров).<br />
<br />
2.LONG Val = SizeBits(BYTE Bignum, LONG_PTR* pVal) = .LONG Val; Свойство. Задает и возвращает размер длинного числа в БИТАХ LONG Val. Bignum-индекс длинного числа в массиве (0-255).<br />
<br />
3.BSTR* String = Bignum(BYTE Bignum, LONG BignumBase=10, LONG_PTR Precision=0, BSTR Separator=”.”, VARIANT_BOOL Exponential=-1) = BSTR* String; Свойство. Принимает и возвращает BSTR* строку String (задает число или возвращает значение). Bignum-индекс длинного числа в массиве (0-255). BignumBase-база длинного числа (от 2 до 36), по умолчанию = 10. Precision – точность (кол-во цифр в числе), по умолчанию = 0 - максимальная (равна заданному размеру в битах). Separator – символ разделителя целой и дробной частей числа, по умолчанию точка(“.”). Exponential – по умолчанию =-1 экспоненциальная запись, 0 – десятичная (в разработке).<br />
<br />
(При парсинге строки в число, ожидаемая десятичная точка берется из текущей локали, на системах, предоставляющих localeconv).<br />
<br />
4.LONG Val = Sign(BYTE Bignum); Свойство. Возвращает знак длинного числа LONG Val.Возвращает 1 если Bignum &gt; 0, 0 если Bignum = 0, и -1 если Bignum &lt; 0.<br />
<br />
5.LONG Val = Compare(BYTE Bignum1, BYTE Bignum2); Метод. Сравнивает два длинных числа. Возвращает 1 если Bignum1 &gt; Bignum2, 0 если Bignum1 = Bignum2, и -1 если Bignum1 &lt; Bignum2.<br />
<br />
6.SizeBitsSet(BYTE Bignum, LONG_PTR SizeBits); Метод. Задает размер длинного числа в БИТАХ LONG Val.<br />
<br />
7.BignumSet(BYTE Bignum, BSTR StringBSTR, LONG BignumBase=10, BSTR Separator=”.”); Метод. Задает число с параметрами аналогичными свойству Bignum().<br />
<br />
8.Sum(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Суммирует два длинных числа. BignumSet = Bignum1 + Bignum2<br />
<br />
9.SumL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Суммирует длинное число с обычным. BignumSet = Bignum1 + LONG_PTR(х64:LONG_PTR= LONGLONG, х32:LONG_PTR= LONG)<br />
<br />
10.Abs(BYTE BignumSet, BYTE Bignum1); Метод. Возвращает модуль значения из Bignum1 в BignumSet.<br />
<br />
11.Subtract(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Вычитает из одного длинного числа второе. BignumSet = Bignum1 - Bignum2.<br />
<br />
12.SubtractL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Вычитает из длинного числа обычное. BignumSet = Bignum1 - LONG_PTR.<br />
<br />
13.Multiply(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Умножает одно длинное число на второе. BignumSet = Bignum1 * Bignum2.<br />
<br />
14.MultiplyL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Умножает длинное число на обычное. BignumSet = Bignum1 * LONG_PTR.<br />
<br />
15.Divide(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Делит одно длинное число на второе. BignumSet = Bignum1 / Bignum2<br />
<br />
16.DivideL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Делит длинное число на обычное. BignumSet = Bignum1 / LONG_PTR.<br />
<br />
17.Root(BYTE BignumSet, BYTE Bignum1); Метод. Извлекает квадратный корень из Bignum1. Результат возвращает в BignumSet. BignumSet = √ Bignum1.<br />
<br />
18.Negate(BYTE BignumSet, BYTE Bignum1); Метод. Возвращает значение с противоположным знаком из Bignum1 в BignumSet. BignumSet = - Bignum1.<br />
<br />
19.Power(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Возводит в степень LONG_PTR длинное число Bignum1, результат возвращает в BignumSet. BignumSet = Bignum1 ^ LONG_PTR.<br />
<br />
20.Clone(BYTE BignumSet, BYTE Bignum1); Метод. Копирует Bignum1 в BignumSet. BignumSet = Bignum1<br />
<br />
21.FileSet(BYTE Bignum, BSTR StringBSTRFileName, LONG BignumBase=10); Метод. Загружает длинное число из файла (*.txt). Принимает BSTR* строку StringBSTRFileName в качестве полного пути и имени файла. Bignum-индекс длинного числа в массиве (0-255). BignumBase-база числа (от 2 до 36), по умолчанию = 10.<br />
<br />
(При парсинге строки в число, ожидаемая десятичная точка берется из текущей локали, на системах, предоставляющих localeconv).<br />
<br />
22.FileGet(BYTE Bignum, BSTR StringBSTRFileName, LONG BignumBase=10, LONG_PTR Precision=0); Метод. Сохраняет длинное число в файл (*.txt). Принимает BSTR* строку StringBSTRFileName в качестве полного пути и имени файла. Bignum-индекс длинного числа в массиве (0-255). BignumBase-база числа (от 2 до 36), по умолчанию = 10. Precision – точность (кол-во цифр в числе), по умолчанию = 0 - максимальная (равна заданному размеру в битах).<br />
<br />
23.Clear(LONG Bignum=-1); Метод. Освобождает память занятую длинным числом Bignum, или освобождает память занятую всеми числами при заданном параметре по умолчанию = -1. Начиная с v2.0.0.0 деструктор класса сам очищает память (при удалении класса или завершении процедуры в VBA).<br />
<br />
24.LONG Val = BignumArraySize(); Метод. Возвращает количество чисел Bignum в созданном классе/массиве. Начиная с v2.0.0.0 (теперь массив чисел может быть произвольного размера, а не как ранее 256 чисел. Размер увеличиваться автоматически.)<br />
<br />
25.BSTR* String = GetToBignumInt(LONG Bignum, LONG BignumBase=10); Метод. Преобразовать Bignum из Float в Integer и вывести. ВАЖНО! преобразование происходит с заданной ранее точностью в битах для Float (SizeBitsSet). Без округлений, отбрасывается дробная часть. Будьте внимательнее в таких преобразованиях. Начиная с v2.0.0.0.<br />
<br />

				   </div>
			   </div><br />
<br />
<b>3. Класс VBA - набор функций/методов для работы в VBA, и в других COM/ActiveX поддерживающих языках</b><br />
Методы:<br />
3.1 <a href="https://www.cyberforum.ru/blogs/829006/blog5534.html"><i>ArraySortS()</i></a> - быстрая сортировка данных (String) в одномерном/двухмерном массиве<br />

			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   Параметры метода:<br />
1.array_in_out - указатель на массив (ввод/вывод)<br />
2.sort_order - порядок сортировки : 0-по возрастанию, 1-по убыванию<br />
3.key_1 - ключи сортировки (индекс столбца или строки) по умолчанию - первый столбец/строка<br />
4.key_2<br />
5.key_3<br />
6.sort_orientation - ориентация сортировки (0 - по строкам, 1 - по столбцам, 2- целый массив вывод строка-столбец, 3- целый массив вывод столбец-строка)<br />
7.delete_duplicates - удаляем дубликаты (в одномерных массивах)<br />
8.out_array_index - выводим индексы, &quot;булево&quot; 1/0 (тогда основной массив array_in_out - не меняется, выводятся данные в index_array_out )<br />
9.index_array_out - одномерный массив с индексами (с учетом всех ключей), если задан out_array_index=1<br />
<br />
Все параметры метода, кроме входящего массива - опциональные (с значениями по умолчанию - 0 (ключи-1))<br />
Метод &quot;ArraySort&quot; работает через Variant, т.к. на некоторых скриптовых языках SAFEARRAY ходит через границы COM, только в обертке VARIANT (без изобретения костылей).
				   </div>
			   </div><br />
3.2 <i>FilterUnicodeChar()</i> - получить/удалить любые символы <a rel="nofollow noopener noreferrer" href="https://unicode-table.com" target="_blank" title="https://unicode-table.com">Unicode</a> из строки. Регистрозависимая.<br />

			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   Параметры метода:<br />
1. StringIn - входящая строка<br />
2. Второй параметр (EnableChar) - символы включаемые в итоговую строку (через &quot;-&quot; указывается диапазон, сам &quot;-&quot; выводится если его поставить первым символом в шаблоне)<br />
3. Третий параметр (DisableChar) - символы исключаемые из итоговой строки ( через &quot;-&quot; указывается диапазон, сам &quot;-&quot;тудаляется если его поставить первым символом в шаблоне) .<br />
Последние два параметра - не обязательные. Можно задавать любой из них, можно все два, можно никакой - тогда выводится первоначальная строка
				   </div>
			   </div><br />
3.3 <i>LikeUnicodeChar()</i> - Сравнивает строку с маской/шаблоном (или наоборот исключая символы шаблона). Регистрозависимая. (v1.0.5.0 и выше)<br />

			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   Параметры метода:<br />
1.<b>stringIn</b> - входящая строка<br />
2.<b>maskChar</b> - маска/шаблон (через &quot;-&quot; указывается диапазон, сам &quot;-&quot; выводится/удаляется если его поставить первым символом в шаблоне)<br />
3.<b>invertMask</b> - инвертировать маску (сравнение, исключая символы маски)<br />
Возвращает булево.<br />

				   </div>
			   </div><br />
3.4 <i>Trim()</i> - удаляет из текста все пробелы, за исключением одиночных пробелов между словами.<br />

			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   Параметры метода:<br />
1.StringIn - входящая строка<br />

				   </div>
			   </div><br />
3.5 <i>InStr()</i> - ищем первое вхождение подстроки в строку. Регистрозависимая.<br />

			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   Параметры метода:<br />
1.StringIn - строка в которой производим поиск<br />
2.StringFind - подстрока для поиска в StringIn <br />
3.Start - позиция с которой начинаем поиск в строке
				   </div>
			   </div><br />
3.6 <i>Replace()</i> - заменить одну подстроку на другую. Параметр Start - не усекает строку, в отличии от стандартной Replace. Регистрозависимая<br />

			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   Параметры метода:<br />
1.StringIn - строка в которой производим поиск<br />
2.StringFind - подстрока для поиска и замены в StringIn <br />
3.StringReplace - подстрока на которую заменяем StringFind <br />
3.Start - позиция с которой начинаем поиск и замены подстрок в строке<br />
4.Count - количество замен
				   </div>
			   </div><br />
3.7 <i><a href="https://www.cyberforum.ru/blogs/829006/blog5983.html">ArraySortV()</a></i> - быстрая сортировка данных (Variant) в одномерном/двухмерном массиве<br />

			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   Параметры метода:<br />
1.<b>array_in_out</b> - указатель на массив (ввод/вывод)<br />
2.<b>key_1</b> - ключи сортировки (порядковый номер столбца, начиная с 1), по умолчанию - первый столбец.<br />
3.<b>sort_order1</b> - порядок сортировки для  key_1 : 0-по возрастанию (по умолчанию для всех), 1-по убыванию<br />
4.<b>key_2</b> - по умолчанию - не участвует<br />
5.<b>sort_order2</b> - порядок сортировки для  key_2 <br />
6.<b>key_3</b> - по умолчанию - не участвует<br />
7.<b>sort_order3</b> - порядок сортировки для  key_3 <br />
Ключи задаются по порядку, т.е. сразу указать 3й - нельзя.<br />

				   </div>
			   </div><br />
3.8 <i>Transpose()</i> - быстрое транспонирование (на месте) двухмерного массива (поддерживаются все типы данных)<br />

			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   Параметры метода:<br />
1.<b>array_in_out</b> - указатель на массив (ввод/вывод)<br />

				   </div>
			   </div><br />
3.9 <a href="https://www.cyberforum.ru/blogs/829006/blog6514.html">QRcodePrint()</a> - Печать QR-кода<br />
<br />
3.10 <a href="https://www.cyberforum.ru/blogs/829006/blog6514.html">ConvertFormatImage()</a> - конвертации графических форматов из одного в другой<br />
<br />
3.11 <a href="https://www.cyberforum.ru/blogs/829006/blog6617.html">GetRowsCountCSVansi()</a> - возвращает кол-во строк в файле<br />
<br />
3.12 <a href="https://www.cyberforum.ru/blogs/829006/blog6617.html">GetRowCSVansi()</a> - возвращает найденную строку по индексу<br />
<br />
3.13 <a href="https://www.cyberforum.ru/blogs/829006/blog6617.html">FindRowsInCSVansi()</a> - возвращает найденную строку/строки по искомой подстроке<br />
<br />
3.14 <a href="https://www.cyberforum.ru/blogs/829006/blog6656.html">SortDeleteDuplicateRowsCSVansi()</a> - сортировка и удаление дубликатов строк в csv/txt(ANSI) файлах<br />
<br />
3.15 <a href="https://www.cyberforum.ru/blogs/829006/blog6807.html">HashStringSHA()</a> - хеширование строки разными алгоритмами SHA (+ новейшие SHA3) :<br />
<br />
3.16 <a href="https://www.cyberforum.ru/blogs/829006/blog7235.html">Array2Dto1D()</a> - быстрое преобразования двухмерного массива в одномерный (данные не обрезаются, 2е измерение преобразуются в очередь) (v1.0.5.0 и выше)<br />

			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   Параметры метода:<br />
1.<b>array_in_out</b> - массив, который нужно преобразовать<br />
2.<b>lLbound1</b> - нижняя граница нового массива (по умолчанию=0)<br />

				   </div>
			   </div><br />
3.17 <a href="https://www.cyberforum.ru/blogs/829006/blog7235.html">Array1Dto2D()</a> - быстрое преобразование одномерного массива в двухмерный (данные не удаляются) (v1.0.5.0 и выше)<br />

			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   Параметры метода:<br />
1.<b>array_in_out</b> - массив, который нужно преобразовать<br />
2.<b>lLbound1</b> - нижняя граница нового массива, 1е измерение (по умолчанию=0)<br />
3.<b>lLbound2</b> - нижняя граница нового массива, 2е измерение (по умолчанию=0)<br />

				   </div>
			   </div><br />
3.18 <a href="https://www.cyberforum.ru/blogs/829006/blog7726.html">ArrayFilterV()</a> - фильтр для одномерного и двухмерного массива (тип данных VARIANT) с любым количества столбцов, с любом количеством условий (начиная с v2.0.1.0, в XLL c v3.2.1.0).<br />

			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   Параметры метода:<br />
1. <b>array_in </b>- массив входящий (одномерный, двухмерный), тип данных VARIANT.<br />
2. <b>array_parameters </b>- массив задаваемых параметров, тип данных VARIANT (6 параметров для одного условия, можно для одного и того же столбца, можно для разных). Количество условий не ограничено. Условия можно создать из списка, можно создать двухмерный массив и заполнить, можно забрать сразу с листа Excel.<br />
3. <b>array_out_index </b>- режим вывода: 0- отфильтрованный массив, 1-массив индексов<br />
4. <b>array_out </b>- массив результатов<br />

				   </div>
			   </div><br />
<br />
Новые инструменты для массива (начиная с BedvitCOM.dll_v2.0.2.0, BedvitXLL.dll_v3.2.2.0)<br />
Для массивов любого количества размерностей, тип данных VARIANT.<br />
Преобразование происходит &quot;на месте&quot; (штатным инструментом от Microsoft VariantChangeType, CharUpperW, CharLowerW)<br />
Для всех элементов массива, для которых возможны преобразования:<br />
3.19 <i>ArrayCharLowerV() </i>- преобразовать все символы строки в нижний регистр<br />

			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   Параметры метода:<br />
1.<b>array_in_out</b> - массив, который нужно преобразовать (на месте)<br />

				   </div>
			   </div><br />
3.20 <i>ArrayCharUpperV() </i>- преобразовать все символы строки в ВЕРХНИЙ регистр<br />

			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   Параметры метода:<br />
1.<b>array_in_out</b> - массив, который нужно преобразовать (на месте)<br />

				   </div>
			   </div><br />
3.21 <i>ArrayNumToCharV() </i>- преобразовать все данные в тип: String<br />

			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   Параметры метода:<br />
1.<b>array_in_out</b> - массив, который нужно преобразовать (на месте)<br />

				   </div>
			   </div><br />
3.22 <i>ArrayCharToNumV() </i>- преобразовать все данные в тип: Double (числа сохраненные как текст)<br />

			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   Параметры метода:<br />
1.<b>array_in_out</b> - массив, который нужно преобразовать (на месте)<br />

				   </div>
			   </div><br />
<br />
<br />
<br />
<b>4. Класс <a href="https://www.cyberforum.ru/blogs/829006/blog7178.html">UnorderedMap</a> - ассоциативный контейнер, содержащий пары ключ-значение с уникальными ключами. Поиск, вставка и удаление элементов имеют среднюю постоянную сложность.</b><br />
<br />
<br />
<br />
<b><font color="Red">...НОВЫЕ ФУНКЦИИ СМОТРИ В РАЗДЕЛЕ <a rel="nofollow noopener noreferrer" href="https://bedvit.ru/news/" target="_blank" title="https://bedvit.ru/news/">&quot;Новости&quot;</a> И В  <a rel="nofollow noopener noreferrer" href="https://bedvit.ru/wiki/" target="_blank" title="https://bedvit.ru/wiki/">&quot;WIKI&quot;</a></font></b><br />
<br />
<br />
<br />
<br />
<font color="darkred"><u><b>2.BedvitXLL (библиотека XLL c C API Functions для Excel)</b></u></font><br />
<img src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=7477&amp;st= c=1&amp;d=1650463088" border="0" alt="" style="max-width: 800px; margin: 5px 0px 5px 0px;" /><br />
<b>версия библиотеки XLL - 1.0.0.0</b><br />
Добавлены функции<br />
<b>02/02/2021 - новая версия библиотеки XLL - 2.0.0.0</b><br />
Добавлена вкладка команд.<br />
<b>16/04/2022 - новая версия библиотеки XLL - 3.0.0.0</b><br />
Добавлен функционал работы с VBA-кодом (хранение, выполнение, шифрование). + Новый формат файла пользовательских сохранений (не совместим со старым).<br />
<br />
Область применения - <b>Excel 2010 (х32, х64) и выше, VBA</b><br />
Устанавливается так же, как и &quot;обычная&quot; надстройка Excel (xla, xlam) в папку надстроек или просто открывается как файл.<br />
<b>Содержит библиотеку BedvitCOM,</b> распаковывает (в пользовательский &quot;TEMP&quot;) и регистрирует автоматом COM при открытии XLL, и автоматически удаляет COM из реестра при закрытии XLL.<br />
т.е. пользователю НЕ нужно ничего самостоятельно регистрировать, нужно только открыть XLL - всё, можно работать в Excel с новыми функциями и COM-объектами из библиотеки COM в VBA (как с ранним, так и с поздним связыванием).<br />
<b>Upd: 18.12.2022</b>. Начиная с версии 4.4 библиотека СОМ выгружается в ту же папку, из которой запускается надстройка XLL. Для автоматического подключения  пользователю нужно разово нажать кнопку подключения СОМ<br />
<br />
<br />
<b><font color="Blue">Примеры использования:</font></b>
			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   <br />
Начиная с версии<b> xll v1.0.3.0 </b>рекомендуется использовать <b>раннее связывание</b>, т.к. теперь библиотека сама <b>подключает COM в References</b> и пользователю не нужно писать доп код или подключать вручную COM.<br />
<br />
<font color="blue">Раннее связывание, версия <b>xll v1.0.3.0</b> и выше.</font><br />
<div class="codeblock"><table class="vb"><thead><tr><td colspan="2" id="951631003"  class="head">Visual Basic</td></tr></thead><tbody><tr class="li1"><td><div id="951631003" style="height: 78px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
</pre></td><td class="de1"><pre class="de1"><span class="kw2">Sub</span> Help()
<span class="kw4">Dim</span> bCOM <span class="kw4">As</span> <span class="kw2">New</span> BedvitCOM.BignumArithmeticFloat: bCOM.Help
<span class="kw3">End</span> <span class="kw2">Sub</span></pre></td></tr></table></div></td></tr></tbody></table></div><font color="blue">Позднее связывание (одной строкой)</font><div class="codeblock"><table class="vb"><thead><tr><td colspan="2" id="339366709"  class="head">Visual Basic</td></tr></thead><tbody><tr class="li1"><td><div id="339366709" style="height: 78px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
</pre></td><td class="de1"><pre class="de1"><span class="kw2">Sub</span> Help()
<span class="kw2">CreateObject</span>(<span class="st0">&quot;BedvitCOM.BignumArithmeticFloat&quot;</span>).Help
<span class="kw3">End</span> <span class="kw2">Sub</span></pre></td></tr></table></div></td></tr></tbody></table></div><font color="blue">Раннее связывание (версии xll до v1.0.3.0) вариант 1 (подключаем СОМ в коде)</font><div class="codeblock"><table class="vb"><thead><tr><td colspan="2" id="969229687"  class="head">Visual Basic</td></tr></thead><tbody><tr class="li1"><td><div id="969229687" style="height: 174px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
</pre></td><td class="de1"><pre class="de1"><span class="kw2">Sub</span> RUN_Help() <span class="co1">'подключаем СОМ в References, для раннего связывания</span>
<span class="kw4">On</span> <span class="kw4">Error</span> <span class="kw4">Resume</span> <span class="kw3">Next</span>: ThisWorkbook.VBProject.References.AddFromGuid <span class="st0">&quot;{77D79CA3-15A0-4310-B8D8-0BCBE3F72D96}&quot;</span>, 1, 0
Help
ThisWorkbook.VBProject.References.Remove ThisWorkbook.VBProject.References(<span class="st0">&quot;BedvitCOM&quot;</span>) <span class="co1">'отключаем библу в References</span>
<span class="kw3">End</span> <span class="kw2">Sub</span>
&nbsp;
<span class="kw2">Sub</span> Help()
<span class="kw4">Dim</span> bCOM <span class="kw4">As</span> <span class="kw2">New</span> BedvitCOM.BignumArithmeticFloat: bCOM.Help
<span class="kw3">End</span> <span class="kw2">Sub</span></pre></td></tr></table></div></td></tr></tbody></table></div><font color="blue">Раннее связывание (версии xll до v1.0.3.0) вариант 2 (подключаем СОМ при открытии книги)</font><div class="codeblock"><table class="vb"><thead><tr><td colspan="2" id="819661651"  class="head">Visual Basic</td></tr></thead><tbody><tr class="li1"><td><div id="819661651" style="height: 78px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
</pre></td><td class="de1"><pre class="de1"><span class="kw2">Sub</span> Help()
<span class="kw4">Dim</span> bCOM <span class="kw4">As</span> <span class="kw2">New</span> BedvitCOM.BignumArithmeticFloat: bCOM.Help
<span class="kw3">End</span> <span class="kw2">Sub</span></pre></td></tr></table></div></td></tr></tbody></table></div>а в модуль книги<div class="codeblock"><table class="vb"><thead><tr><td colspan="2" id="92219304"  class="head">Visual Basic</td></tr></thead><tbody><tr class="li1"><td><div id="92219304" style="height: 206px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="de1"><pre class="de1"><span class="kw2">Private</span> <span class="kw2">Sub</span> Workbook_AfterSave(<span class="kw4">ByVal</span> Success <span class="kw4">As</span> <span class="kw1">Boolean</span>)
&nbsp; &nbsp; <span class="kw4">On</span> <span class="kw4">Error</span> <span class="kw4">Resume</span> <span class="kw3">Next</span>: ThisWorkbook.VBProject.References.AddFromGuid <span class="st0">&quot;{77D79CA3-15A0-4310-B8D8-0BCBE3F72D96}&quot;</span>, 1, 0 <span class="co1">' подключаем библу &quot;BedvitCOM&quot; в References - version(1.0) для раннего связывания (если библа уже подключена - On Error Resume Next)</span>
<span class="kw3">End</span> <span class="kw2">Sub</span>
&nbsp;
<span class="kw2">Private</span> <span class="kw2">Sub</span> Workbook_BeforeSave(<span class="kw4">ByVal</span> SaveAsUI <span class="kw4">As</span> <span class="kw1">Boolean</span>, Cancel <span class="kw4">As</span> <span class="kw1">Boolean</span>)
&nbsp; &nbsp; <span class="kw4">On</span> <span class="kw4">Error</span> <span class="kw4">Resume</span> <span class="kw3">Next</span>: ThisWorkbook.VBProject.References.Remove ThisWorkbook.VBProject.References(<span class="st0">&quot;BedvitCOM&quot;</span>) <span class="co1">'отключаем библу в References</span>
<span class="kw3">End</span> <span class="kw2">Sub</span>
&nbsp;
<span class="kw2">Private</span> <span class="kw2">Sub</span> Workbook_Open()
&nbsp; &nbsp; <span class="kw4">On</span> <span class="kw4">Error</span> <span class="kw4">Resume</span> <span class="kw3">Next</span>: ThisWorkbook.VBProject.References.AddFromGuid <span class="st0">&quot;{77D79CA3-15A0-4310-B8D8-0BCBE3F72D96}&quot;</span>, 1, 0 <span class="co1">' подключаем библу &quot;BedvitCOM&quot; в References - version(1.0) для раннего связывания (если библа уже подключена - On Error Resume Next)</span>
<span class="kw3">End</span> <span class="kw2">Sub</span></pre></td></tr></table></div></td></tr></tbody></table></div>
				   </div>
			   </div><br />
<br />
<br />
<b>+Новые категории Функций в Excel:</b><br />
1.<b>XLLBignumArithmeticInteger</b> - функции для работы с длинными целыми числами.<br />
Функции:<br />
1.1 <i>SumInteger()</i> - сложение двух длинных/обычных целых чисел <br />
1.2 <i>SubtractInteger()</i> - вычитание двух длинных/обычных целых чисел<br />
1.3 <i>MultiplyInteger()</i> - умножение двух длинных/обычных целых чисел<br />
1.4 <i>DivideInteger()</i> - деление двух длинных/обычных целых чисел - Неполное частное<br />
1.5 <i>ModInteger()</i> - деление двух длинных/обычных целых чисел - Остаток от деления<br />
1.6 <i>PowerInteger()</i> - возведение в степень длинного/обычного целого числа<br />
1.7 <i>ConvertBaseInteger()</i> - конвертирование целого числа (строки) из одной базы в другую (от 2 до 36).<br />
1.8 <i>FactorialInteger()</i> - факториал задаваемого числа.<br />
<br />
2.<b>XLLBignumArithmeticFloat</b> - функции для работы с длинными дробными числами.<br />
Функции:<br />
2.1 <i>SumFloat()</i> - сложение двух длинных/обычных чисел с плавающей точкой <br />
2.2 <i>SubtractFloat()</i> - вычитание двух длинных/обычных чисел с плавающей точкой <br />
2.3 <i>MultiplyFloat()</i> - умножение двух длинных/обычных чисел с плавающей точкой <br />
2.4 <i>DivideFloat()</i> - деление двух длинных/обычных чисел с плавающей точкой <br />
2.5 <i>PowerFloat()</i> - возведение в степень длинного/обычного числа<br />
2.6 <i>RootFloat()</i> - извлечение квадратного корня из длинного/обычного числа<br />
<br />
3.<b>XLL</b> - функции не попавшие в другие категории данной библиотеки, с разнообразным функционалом.<br />
Функции:<br />
3.1 <i>FilterUnicodeChar()</i> - получить/удалить любые символы <a rel="nofollow noopener noreferrer" href="https://unicode-table.com" target="_blank" title="https://unicode-table.com">Unicode</a> из строки.<br />

			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   Параметры функции:<br />
1. StringIn - входящая строка<br />
2. Второй параметр (EnableChar) - символы включаемые в итоговую строку (через &quot;-&quot; указывается диапазон, сам &quot;-&quot; выводится/удаляется если его поставить первым символом в шаблоне)<br />
3. Третий параметр (DisableChar) - символы исключаемые из итоговой строки (через &quot;-&quot; указывается диапазон).<br />
<br />
Последние два параметра - не обязательные. Можно задавать любой из них, можно все два, можно никакой - тогда выводится первоначальная строка
				   </div>
			   </div><br />
3.2 <i>TrimXLL()</i> - удаляет из текста все пробелы, за исключением одиночных пробелов между словами.<br />

			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   Параметры функции:<br />
1.StringIn - входящая строка<br />
2.StringOut - результирующая строка
				   </div>
			   </div><br />
3.2 <i>VlookupXLL()</i> - это смесь ВПР() и ПРОСМОТР(). <a rel="nofollow noopener noreferrer" href="https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&amp;FID=5&amp;TID=107609&amp;TITLE_SEO=107609-razmyshlenie-o-c-api-functions-dlya-excel&amp;MID=1003365&amp;tags=%D0%BD%D0%B0%D0%BA%D0%BE%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5&amp;TIT=#message1003365" target="_blank" title="https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&amp;FID=5&amp;TID=107609&amp;TITLE_SEO=107609-razmyshlenie-o-c-api-functions-dlya-excel&amp;MID=1003365&amp;tags=%D0%BD%D0%B0%D0%BA%D0%BE%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5&amp;TIT=#message1003365">Подробное описание</a><br />

			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   Параметры функции:<br />
1.ArrayFind - массив для поиска<br />
2.Find- значение, которое ищем<br />
3.ArrayResult - значение во втором массиве, соответствующее найденному значению в первом массиве.
				   </div>
			   </div><br />
3.3 <a href="https://www.cyberforum.ru/blogs/829006/blog6617.html">GetRowsCountCSVansi()</a> - возвращает кол-во строк в файле<br />
<br />
3.4 <a href="https://www.cyberforum.ru/blogs/829006/blog6617.html">GetRowCSVansi()</a> - возвращает найденную строку по индексу<br />
<br />
3.5 <a href="https://www.cyberforum.ru/blogs/829006/blog6617.html">FindRowsInCSVansi()</a> - возвращает найденную строку/строки по искомой подстроке<br />
<br />
3.6 <a href="https://www.cyberforum.ru/blogs/829006/blog6514.html">QRcodePrint()</a> - Печать QR-кода<br />
<br />
3.7 <i>TextJoinXLL()</i> - объединяет текст из нескольких строк, вставляя между текстовыми значениями указанные разделитель(и) - можно задать массив разделителей. Введенные числа будут считаться текстом. Аналог <a rel="nofollow noopener noreferrer" href="https://support.microsoft.com/ru-ru/office/%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F-%D0%BE%D0%B1%D1%8A%D0%B5%D0%B4%D0%B8%D0%BD%D0%B8%D1%82%D1%8C-357b449a-ec91-49d0-80c3-0e8fc845691c" target="_blank" title="https://support.microsoft.com/ru-ru/office/%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F-%D0%BE%D0%B1%D1%8A%D0%B5%D0%B4%D0%B8%D0%BD%D0%B8%D1%82%D1%8C-357b449a-ec91-49d0-80c3-0e8fc845691c">ОБЪЕДИНИТЬ</a> (<a rel="nofollow noopener noreferrer" href="https://support.microsoft.com/en-us/office/textjoin-function-357b449a-ec91-49d0-80c3-0e8fc845691c" target="_blank" title="https://support.microsoft.com/en-us/office/textjoin-function-357b449a-ec91-49d0-80c3-0e8fc845691c">TEXTJOIN</a>) - начиная с  v2.0.1.7<br />
Если объединенная строка содержит свыше 32767 символов (ограничение для ячейки), функция вернет ошибку #ЧИСЛО!.<br />

			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   Параметры функции:<br />
1.Range - массив/диапазон строк<br />
2.Delimiter - строка-разделитель (опционально = &quot;&quot;)<br />
3.IgnoreEmpty - игнорировать пустые ячейки в Range (опционально = 0 - не игнорировать)
				   </div>
			   </div><br />
<br />
<br />
<br />
<b><font color="Red">...НОВЫЕ ФУНКЦИИ СМОТРИ В РАЗДЕЛЕ <a rel="nofollow noopener noreferrer" href="https://bedvit.ru/news/" target="_blank" title="https://bedvit.ru/news/">&quot;Новости&quot;</a> И В  <a rel="nofollow noopener noreferrer" href="https://bedvit.ru/wiki/" target="_blank" title="https://bedvit.ru/wiki/">&quot;WIKI&quot;</a></font></b><br />
<br />
<br />
<br />
[APLACE=&quot;v2.0.0.0&quot;]<b>+Команды меню (начиная с v2.0.0.0)</b>[/APLACE]<br />
<img src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=7477&amp;st= c=1&amp;d=1650209102" border="0" alt="" style="max-width: 800px; margin: 5px 0px 5px 0px;" /><br />
+ Help: Содержание + Лог текущей версии библиотеки.<br />
+ Открыть (сохраненные настройки)<br />
+ Сохранить в файл (текущие настройки)<br />
+ Влияющие ячейки (на выделенный диапазон)<br />
+ Зависимые ячейки (от выделенного диапазона)<br />
+ Работа с Форматами ячеек (задать, сохранить, выбрать сохраненный и т.д.)<br />
+ Конвертировать число сохраненное как текст в число (с удалением пробелов, мягких переносов, непечатаемых символов между цифрами) - реализовано v2.0.1.7<br />
+ Разорвать связи на текущем листе с другими ЛИСТАМИ этой книги и внешними файлами<br />
+ Транспонирование на месте<br />
+ Работа с именами (показать скрытые, удалить ошибочные, удалить все),в т.ч. скрытые, не отображаемые в диспетчере имён<br />
+ Перевести условное форматирование в обычный формат ячейки в выделенном диапазоне или на всем листе - реализовано v3.0.0.0<br />
+ Подбор слагаемых под нужную сумму<br />
+ Выделить разным цветом группы дубликатов в выделенном диапазоне или на всем листе с выводом статистики - реализовано v2.0.2.4<br />
+ Быстрый поиск значений на листе<br />
+ Вывести на новый лист список всех листов текущей книги (с гиперссылкой)<br />
+ Вывести на новый лист список всех ячеек текущей книги, содержащих ошибку (с гиперссылкой) - реализовано v2.0.2.4<br />
+ Вывести на новый лист список всех внешних связей или ячеек текущей книги, содержащих ссылку на другую книгу(с гиперссылкой) - реализовано v3.0.0.0<br />
+ Удалить пустые строки и столбцы в данных на листе<br />
+ А,R - Стиль ссылок: А1, R1C1<br />
+ <a href="https://www.cyberforum.ru/blogs/829006/blog7496.html">Блок работы с VBA-кодом (хранение, выполнение, просмотр по паролю и т.д.)</a><br />
+ <a href="https://www.cyberforum.ru/blogs/829006/blog8405.html">Блок работы с хранением и шифрованием диапазонов (формул, значений) листа Excel</a><br />
+ <a rel="nofollow noopener noreferrer" href="https://bedvit.ru/xll/install/" target="_blank" title="https://bedvit.ru/xll/install/">BedvitCOM: ON/OFF/R </a>- Режимы автоматического подключение библиотеки BedvitCOM в References (VBA) и реестре Windows<br />
+ XLL Язык меню: RU, EN (сейчас поддерживается только RU)<br />
+ XLL Диалог: - режим диалога, см. <b><a rel="nofollow noopener noreferrer" href="https://bedvit.ru/wiki/" target="_blank" title="https://bedvit.ru/wiki/">Диалог</a></b><br />
+ XLL API: возможность использования команд XLL в VBA, с задавливаемыми параметрами(<br />
первый параметр для каждой команды - API диалога: &quot;0&quot;-Запрос пользователю, &quot;1&quot;-Да, &quot;2&quot;-Нет, &quot;3&quot;-Отмена.<br />
Задаётся отдельно для каждого диалога, т.е. строка &quot;0123&quot; задаёт 4 параметра:  &quot;Запрос пользователю&quot;, &quot;Да&quot;, &quot;Нет&quot;, &quot;Отмена&quot; на 4 последовательных диалога)<br />
<br />
<br />
<br />
<b><font color="Red">...НОВЫЕ КОМАНДЫ МЕНЮ СМОТРИ В РАЗДЕЛЕ <a rel="nofollow noopener noreferrer" href="https://bedvit.ru/news/" target="_blank" title="https://bedvit.ru/news/">&quot;Новости&quot;</a> И В  <a rel="nofollow noopener noreferrer" href="https://bedvit.ru/wiki/" target="_blank" title="https://bedvit.ru/wiki/">&quot;WIKI&quot;</a></font></b><br />
<br />
<br />
<br />
<font color="RoyalBlue"><b>Версии библиотек можно посмотреть в имени архива или свойствах файла.<br />
В XLL эти свойства скрыты, нужно временно сменить расширение файла на DLL, см. рис. ниже.</b></font><br />
<img src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=7478&amp;st= c=1&amp;d=1650210968" border="0" alt="" style="max-width: 800px; margin: 5px 0px 5px 0px;" /></div>


<!-- attachments -->
	<div style="margin-top:10px">

		
			<fieldset class="fieldset">
				<legend>Миниатюры</legend>
				<div style="padding:3px">
				
	<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=5495&amp;d=1565106441" target="attachment" rel="Lightbox" id="attachment5495"><img loading="lazy" decoding="async" class="thumbnail" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=5495&amp;stc=1&amp;thumb=1&amp;d=1565106441" border="0" alt="Нажмите на изображение для увеличения
Название: BedvitCOM_FilterUnicodeChar.PNG
Просмотров: 1069
Размер:	50.1 Кб
ID:	5495" /></a>
	&nbsp;
	

	<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=5496&amp;d=1565106441" target="attachment" rel="Lightbox" id="attachment5496"><img loading="lazy" decoding="async" class="thumbnail" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=5496&amp;stc=1&amp;thumb=1&amp;d=1565106441" border="0" alt="Нажмите на изображение для увеличения
Название: BedvitXLL_FilterUnicodeChar.PNG
Просмотров: 880
Размер:	28.3 Кб
ID:	5496" /></a>
	&nbsp;
	

	<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=5499&amp;d=1565165246" target="attachment" rel="Lightbox" id="attachment5499"><img loading="lazy" decoding="async" class="thumbnail" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=5499&amp;stc=1&amp;thumb=1&amp;d=1565165246" border="0" alt="Нажмите на изображение для увеличения
Название: BedvitXLL_КатегорииNew.PNG
Просмотров: 804
Размер:	23.6 Кб
ID:	5499" /></a>
	&nbsp;
	
		<br /><br />
	

	<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=5649&amp;d=1571735247" target="attachment" rel="Lightbox" id="attachment5649"><img loading="lazy" decoding="async" class="thumbnail" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=5649&amp;stc=1&amp;thumb=1&amp;d=1571735247" border="0" alt="Нажмите на изображение для увеличения
Название: BedvitXLL-factorial.PNG
Просмотров: 710
Размер:	18.1 Кб
ID:	5649" /></a>
	&nbsp;
	

	<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=6445&amp;d=1598020399" target="attachment" rel="Lightbox" id="attachment6445"><img loading="lazy" decoding="async" class="thumbnail" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=6445&amp;stc=1&amp;thumb=1&amp;d=1598020399" border="0" alt="Нажмите на изображение для увеличения
Название: BedvitCOM_References.PNG
Просмотров: 620
Размер:	90.0 Кб
ID:	6445" /></a>
	&nbsp;
	

	<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=6780&amp;d=1613045143" target="attachment" rel="Lightbox" id="attachment6780"><img loading="lazy" decoding="async" class="thumbnail" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=6780&amp;stc=1&amp;thumb=1&amp;d=1613045143" border="0" alt="Нажмите на изображение для увеличения
Название: RibbonXLL2.PNG
Просмотров: 499
Размер:	69.2 Кб
ID:	6780" /></a>
	&nbsp;
	
		<br /><br />
	

	<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=7477&amp;d=1650463060" target="attachment" rel="Lightbox" id="attachment7477"><img loading="lazy" decoding="async" class="thumbnail" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=7477&amp;stc=1&amp;thumb=1&amp;d=1650463060" border="0" alt="Нажмите на изображение для увеличения
Название: XLLMenu.PNG
Просмотров: 10653
Размер:	55.3 Кб
ID:	7477" /></a>
	&nbsp;
	

	<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=7478&amp;d=1650210967" target="attachment" rel="Lightbox" id="attachment7478"><img loading="lazy" decoding="async" class="thumbnail" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=7478&amp;stc=1&amp;thumb=1&amp;d=1650210967" border="0" alt="Нажмите на изображение для увеличения
Название: bedvit_ver.PNG
Просмотров: 5479
Размер:	31.0 Кб
ID:	7478" /></a>
	&nbsp;
	

				</div>
			</fieldset>
		
		
			<fieldset class="fieldset">
				<legend>Изображения</legend>
				<div style="padding:3px">
				<img loading="lazy" decoding="async" class="attach" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=5648&amp;stc=1&amp;d=1571735133" border="0" alt="" />&nbsp;<img loading="lazy" decoding="async" class="attach" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=6164&amp;stc=1&amp;d=1587588686" border="0" alt="" />&nbsp;
				</div>
			</fieldset>
		
		
		

	</div>
<!-- / attachments -->
]]></content:encoded>
			<dc:creator>bedvit</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/829006/5958.html</guid>
		</item>
		<item>
			<title><![CDATA[Клеточные автоматы ч.2 - Conway's Game of Life (С++ WinAPI)]]></title>
			<link>https://www.cyberforum.ru/blogs/829006/5719.html</link>
			<pubDate>Fri, 01 Mar 2019 18:15:51 GMT</pubDate>
			<description>Решил сделать свой велик. 
Программа *Life*  
Видео и новые версии программы на сайте...</description>
			<content:encoded><![CDATA[<div>Решил сделать свой велик.<br />
Программа <b>Life</b> <br />
Видео и новые версии программы на <a rel="nofollow noopener noreferrer" href="http://bedvit.ru/life/" target="_blank" title="http://bedvit.ru/life/">сайте</a>.<br />
<br />
Продукт написан на<b><i> С++, GUI на WinAPI</i></b>.<br />
Предыдущая часть: <a href="https://www.cyberforum.ru/blogs/829006/blog5718.html">Клеточные автоматы ч.1 - Conway's Game of Life in Excel</a><br />
<br />
<b>Основные параметры:</b><br />
1. Размер игрового поля <b>2^32 на +2^32 клеток</b> (рамка примерно 4,3*4,3 млрд. клеток) - поле закольцовано по X, Y координатам.<br />
2. Масштаб от <b>32 пикселей - одна клетка, до 1 млр. клеток на один пиксель</b> (можно загрузить целиком самый большой космический корабль <a rel="nofollow noopener noreferrer" href="http://www.conwaylife.com/wiki/Gemini" target="_blank" title="http://www.conwaylife.com/wiki/Gemini">&quot;Gemini&quot;</a>, размером рамки в 4 млн. клеток, посмотреть в подробностях - по ссылке есть загрузочный шаблон в архиве и даже увидеть всю игровую вселенную на экране)<br />
3. <b>Замедление хода</b> в мс.(микросекунда=1/1000 сек.)<br />
4. <b>Шаг поколений</b>. В один ход (ход - отрисовка инфо на экране) рассчитываем указанное количество поколений. Параметр нужен для того, что бы посмотреть динамику жизни при скорости выше 60-65 поколений в секунду. Предполагаю, потому как, WinAPI (WM_PAINT) не может отрисовать более 60Гц в секунду (частота обновления экрана). <br />
5. <b>Быстрая отрисовка в WinAPI через CreateDIBSection</b>, с прямым доступом через DIB к битам Bitmap (следующий этап - Dirext3D, пока в разработке).<br />
6. Кнопка <b>&quot;Начало координат&quot;</b> - перемещение в начало координат (левая верхняя точка пользовательского окна - координаты: 0.0). Работает при расчете жизни. Если вдруг потерялись :) Эта же позиция отрисовывается при запуске программы и при создании нового поля. Загрузка всех шаблонов происходит тоже в начало координат.<br />
7. <b>Горячие кнопки</b><br />
8. Сочетание кнопок для действий - новый холст, открыть и сохранить файл - стандартные (к примеру, сохранить CTRL+S)<br />
9. Чтение и запись <b>формата <a rel="nofollow noopener noreferrer" href="http://www.conwaylife.com/wiki/RLE" target="_blank" title="http://www.conwaylife.com/wiki/RLE">RLE</a>, <a rel="nofollow noopener noreferrer" href="http://www.mirekw.com/ca/ca_files_formats.html" target="_blank" title="http://www.mirekw.com/ca/ca_files_formats.html">форматы</a></b><br />
<br />
10. <b>Рисуем/Удаляем левой кнопкой</b><br />
11. <b>Таскаем холст - правой</b><br />
12. <b>Масштабирование - колесико мышки</b><br />
<br />
<br />
<b>14/03/2019 Обновление версии: Life v1.4.0.0 (1.4.0.4)</b><br />
- Обновлен интерфейс и сетка игрового поля.<br />
- Оптимизирован алгоритм расчета и отрисовки - теперь быстрее на 30%.<br />
- Добавлены команды:<br />
13. <b>&quot;Инфо.панель&quot;</b> - информация о настройках, игровом поле.<br />
14. <b>&quot;Показать ареал&quot;</b> - показать весь ареал (клетки, где была и есть жизнь) на экране.<br />
15. <b>&quot;Автомасштаб&quot; </b> - автомасштабирование ареала до размеров экрана.<br />
16. <b>&quot;Ареал по живым&quot;</b> - сужения ареала только до живых клеток.<br />
<br />
И замеченного: у меня, версия <b>х32</b> работает <b>на 30% быстрее</b>, чем <b>х64</b> (win7 x64), что на первый взгляд, кажется парадоксальным (в профилировщике видно, что в версии х64 больше ресурсов уходит на поиск - &quot;std::unordered_map::find&quot;)<br />
<br />
В комбинации &quot;Автомасштаб&quot; и &quot;Ареал по живым&quot; дают интересный эффект - можно смотреть движение одиночных фигур в пространстве, к примеру космические корабли (для более качественного просмотра, можно замедлить движение, см.п.3).<br />
<br />
В архиве, прилагаю для теста, несколько простых шаблонов в формате RLE.<br />
<br />
На рис.  &quot;Желудь&quot; <a rel="nofollow noopener noreferrer" href="http://www.conwaylife.com/w/index.php?title=Acorn" target="_blank" title="http://www.conwaylife.com/w/index.php?title=Acorn">(&quot;Acorn&quot;)</a>, &quot;Фабрика космических кораблей&quot; <a rel="nofollow noopener noreferrer" href="http://www.conwaylife.com/w/index.php?title=P416_60P5H2V0_gun" target="_blank" title="http://www.conwaylife.com/w/index.php?title=P416_60P5H2V0_gun">(&quot;p416 60P5H2V0 gun&quot;)</a>, &quot;Космический корабль&quot; (&quot;<a rel="nofollow noopener noreferrer" href="http://www.conwaylife.com/wiki/P15_pre-pulsar_spaceship" target="_blank" title="http://www.conwaylife.com/wiki/P15_pre-pulsar_spaceship">p15 pre-pulsar spaceship</a>&quot;) (по ссылкам есть шаблоны, которые можно загрузить в программу)<br />
<br />
<b>15/04/2019 Обновление версии: Life v1.5.0.0 - Завершение проекта</b><br />
1. Оптимизирован алгоритм расчета, итого с 1й версии до 5й скорость выросла с 26 поколений в секунду до <b>232 п./с.</b> на примере фигуры <a rel="nofollow noopener noreferrer" href="http://www.conwaylife.com/w/index.php?title=P416_60P5H2V0_gun" target="_blank" title="http://www.conwaylife.com/w/index.php?title=P416_60P5H2V0_gun">(&quot;p416 60P5H2V0 gun&quot;)</a> (27 тыс. живых клеток).<br />
2. Расширен диапазон MAX количества <b>живых клеток - до 10 млн. </b>(за счет резервирования большего количества памяти), построение на примере фигуры <a rel="nofollow noopener noreferrer" href="http://www.conwaylife.com/wiki/Max" target="_blank" title="http://www.conwaylife.com/wiki/Max">Max</a>, (в прилагаемых шаблонах есть). С проверкой переполнения.<br />
3. Немного  переработан интерфейс, разделил вывод и ввод, мелкие оптимизации для правильной работы с клавиатуры.<br />
4. Планировал перейти на 3D (работу начал, но на это нужно время, которого сейчас нет, и в ближайшем будущем не будет на этот проект) посему <b>выкладываю рабочие исходники</b> данной <b>версии на WinAPI</b>, может кто-то напишет лучше, подключит Direct3D или в целях самообразования просто попилит код.<br />
Код, писал в целях обучения, еще есть где оптимизировать, к примеру контролируемое перехеширование и перезапись итераторов, позволит изначально использовать меньше памяти (резервировать меньше изначально). Можно, к примеру, уйти от хеш-таблиц, создать динамический выделяемые блоки памяти (к примеру по 1024*1024 байт), с контролем времени жизни (есть/нет живые клетки). С ними линейные скорости чтения, поиска (мы знаем адрес), записи. Перемещение - смещение на степень двойки очень быстрая процедура. Но опять же, есть и свои подводные камни. А времени нет додумать концепцию и реализовать.<br />
Исходники с комментариями на русском, распространяются как есть, под свободной лицензией.<br />
Репозиторий: <a rel="nofollow noopener noreferrer" href="https://github.com/bedvit/Life" target="_blank" title="https://github.com/bedvit/Life">https://github.com/bedvit/Life</a><br />
<br />
<b>13/05/2019 Обновление версии: Life v1.7.0.0 - Игровое поле, пользовательские сообщения</b><br />
1. Реализована закольцовка игрового поля по по X, Y координатам.<br />
2. Реализован правильный механизм масштабирования на границах<br />
3. Увеличен диапазон масштабирования до 1 млр. клеток на один пиксель, теперь всю вселенную можно уместить на экран и даже в несколько пикселей (удобно при масштабировании/поиске сильно отдаленных друг от друга объектов).<br />
4. Добавлены пользовательские сообщения (о выходе за рамки игрового поля и т.д.)<br />
5. Исправлены некритичные ошибки.<br />
6. Репозиторий обновлен.<br />
В итоге: теперь программа представляется, как вполне законченная.</div>


<!-- attachments -->
	<div style="margin-top:10px">

		
			<fieldset class="fieldset">
				<legend>Миниатюры</legend>
				<div style="padding:3px">
				
	<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=5243&amp;d=1551464005" target="attachment" rel="Lightbox" id="attachment5243"><img loading="lazy" decoding="async" class="thumbnail" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=5243&amp;stc=1&amp;thumb=1&amp;d=1551464005" border="0" alt="Нажмите на изображение для увеличения
Название: Life2.PNG
Просмотров: 1082
Размер:	34.6 Кб
ID:	5243" /></a>
	&nbsp;
	

	<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=5304&amp;d=1552582444" target="attachment" rel="Lightbox" id="attachment5304"><img loading="lazy" decoding="async" class="thumbnail" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=5304&amp;stc=1&amp;thumb=1&amp;d=1552582444" border="0" alt="Нажмите на изображение для увеличения
Название: Life1.4.0.0.PNG
Просмотров: 1527
Размер:	32.9 Кб
ID:	5304" /></a>
	&nbsp;
	

	<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=5329&amp;d=1555343525" target="attachment" rel="Lightbox" id="attachment5329"><img loading="lazy" decoding="async" class="thumbnail" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=5329&amp;stc=1&amp;thumb=1&amp;d=1555343525" border="0" alt="Нажмите на изображение для увеличения
Название: Life1.5.0.0_Max2.PNG
Просмотров: 709
Размер:	31.6 Кб
ID:	5329" /></a>
	&nbsp;
	
		<br /><br />
	

	<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=5330&amp;d=1555343525" target="attachment" rel="Lightbox" id="attachment5330"><img loading="lazy" decoding="async" class="thumbnail" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=5330&amp;stc=1&amp;thumb=1&amp;d=1555343525" border="0" alt="Нажмите на изображение для увеличения
Название: Life1.5.0.0_232.PNG
Просмотров: 703
Размер:	73.2 Кб
ID:	5330" /></a>
	&nbsp;
	

				</div>
			</fieldset>
		
		
		
		
			<fieldset class="fieldset">
				<legend>Вложения</legend>
				<table cellpadding="0" cellspacing="3" border="0">
				<tr>
	<td><img loading="lazy" decoding="async" class="inlineimg" src="http://www.cyberforum.ru//cyberstatic.net/images/attach/zip.gif" alt="Тип файла: zip" width="16" height="16" border="0" style="vertical-align:baseline" /></td>
	<td><a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=5328&amp;d=1555343525">Шаблоны.zip</a> (288.5 Кб, 596 просмотров)</td>
</tr><tr>
	<td><img loading="lazy" decoding="async" class="inlineimg" src="http://www.cyberforum.ru//cyberstatic.net/images/attach/zip.gif" alt="Тип файла: zip" width="16" height="16" border="0" style="vertical-align:baseline" /></td>
	<td><a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=5349&amp;d=1557762160">Life(1.7.0.0).zip</a> (128.5 Кб, 599 просмотров)</td>
</tr><tr>
	<td><img loading="lazy" decoding="async" class="inlineimg" src="http://www.cyberforum.ru//cyberstatic.net/images/attach/zip.gif" alt="Тип файла: zip" width="16" height="16" border="0" style="vertical-align:baseline" /></td>
	<td><a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=5651&amp;d=1571735812">Life(1.8.0.0).zip</a> (128.5 Кб, 479 просмотров)</td>
</tr><tr>
	<td><img loading="lazy" decoding="async" class="inlineimg" src="http://www.cyberforum.ru//cyberstatic.net/images/attach/zip.gif" alt="Тип файла: zip" width="16" height="16" border="0" style="vertical-align:baseline" /></td>
	<td><a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=6692&amp;d=1610361274">Life(1.9.0.0).zip</a> (128.6 Кб, 633 просмотров)</td>
</tr>
				</table>
			</fieldset>
		

	</div>
<!-- / attachments -->
]]></content:encoded>
			<dc:creator>bedvit</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/829006/5719.html</guid>
		</item>
		<item>
			<title><![CDATA[Клеточные автоматы ч.1 - Conway's Game of Life in Excel]]></title>
			<link>https://www.cyberforum.ru/blogs/829006/5718.html</link>
			<pubDate>Fri, 01 Mar 2019 17:55:40 GMT</pubDate>
			<description>Зацепила тема, реализовал довольно шустрый (для Excel 2010 и выше) алгоритм. 
То, что вышло -...</description>
			<content:encoded><![CDATA[<div>Зацепила тема, реализовал довольно шустрый (для Excel 2010 и выше) алгоритм.<br />
То, что вышло - прилагаю.<br />
<br />
Функционал:<br />
1. Переключатель &quot;гибель клеток на границе - 0 / закольцованные координаты - 1 &quot;<br />
2. Счетчик поколений<br />
3. Замедление расчета задаваемое в секундах, с дробной частью (к примеру - 0,11 сек.)<br />
4. Выделение ячеек - левой кнопкой, закрашивание выделенного или отдельной ячейки - правой.<br />
5. Поле для жизни 500*500 клеток (поэтому версия №5)<br />
<br />
Предустановленная модель в файле и на рис.<br />
1. Стреляет <a rel="nofollow noopener noreferrer" href="http://www.conwaylife.com/wiki/Gosper_glider_gun" target="_blank" title="http://www.conwaylife.com/wiki/Gosper_glider_gun">&quot;Планерное ружьё Госпера&quot;</a> -слева и ружье <a rel="nofollow noopener noreferrer" href="http://www.conwaylife.com/wiki/B-52_bomber" target="_blank" title="http://www.conwaylife.com/wiki/B-52_bomber">&quot;B-52 bomber&quot;</a> - правее (№2 на рис.)<br />
2. Летящие планеры, поворачивает на 90 градусов - Отражатель <a rel="nofollow noopener noreferrer" href="http://www.conwaylife.com/wiki/Snark" target="_blank" title="http://www.conwaylife.com/wiki/Snark">&quot;Snark&quot;</a> - №3 на рис.<br />
3. <a rel="nofollow noopener noreferrer" href="http://www.conwaylife.com/wiki/P60_glider_shuttle" target="_blank" title="http://www.conwaylife.com/wiki/P60_glider_shuttle">&quot;Планер P60&quot;</a> -  представляет собой осциллятор периода 60, состоящий из планера, отраженного двумя пятиугольниками (планер летает между двумя <a rel="nofollow noopener noreferrer" href="http://www.conwaylife.com/wiki/Pentadecathlon" target="_blank" title="http://www.conwaylife.com/wiki/Pentadecathlon">&quot;Pentadecathlon&quot;</a>) - №4 на рис.<br />
4. Планеры (<a rel="nofollow noopener noreferrer" href="http://www.conwaylife.com/wiki/Glider" target="_blank" title="http://www.conwaylife.com/wiki/Glider">&quot;Glider&quot;</a>), стрелками указаны направления полета.<br />
5.Что бы планеры не улетали их жрут пожиратели <a rel="nofollow noopener noreferrer" href="http://www.conwaylife.com/wiki/Eater_1" target="_blank" title="http://www.conwaylife.com/wiki/Eater_1">&quot;Eater 1&quot;</a> - №1 на рис.<br />
<br />
Запускаем - смотрим движение описанное выше и отмеченное на прилагаемом рисунке.<br />
<br />
В дальнейшем развивать посчитал нецелесообразно, все равно, на больших объемах - медленно выходит. <br />
Решил писать <a href="https://www.cyberforum.ru/blogs/829006/blog5719.html">свою программу.</a></div>


<!-- attachments -->
	<div style="margin-top:10px">

		
			<fieldset class="fieldset">
				<legend>Миниатюры</legend>
				<div style="padding:3px">
				
	<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=5258&amp;d=1551524187" target="attachment" rel="Lightbox" id="attachment5258"><img loading="lazy" decoding="async" class="thumbnail" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=5258&amp;stc=1&amp;thumb=1&amp;d=1551524187" border="0" alt="Нажмите на изображение для увеличения
Название: Life.PNG
Просмотров: 774
Размер:	162.5 Кб
ID:	5258" /></a>
	&nbsp;
	

				</div>
			</fieldset>
		
		
		
			<fieldset class="fieldset">
				<legend>Изображения</legend>
				<table cellpadding="0" cellspacing="3" border="0">
				<tr>
	<td><img loading="lazy" decoding="async" class="inlineimg" src="http://www.cyberforum.ru//cyberstatic.net/images/attach/jpg.gif" alt="Тип файла: jpg" width="16" height="16" border="0" style="vertical-align:baseline" /></td>
	<td><a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=5297&amp;d=1551528323">Life2.jpg</a> (132.8 Кб, 657 просмотров)</td>
</tr>
				</table>
				</fieldset>
		
		
			<fieldset class="fieldset">
				<legend>Вложения</legend>
				<table cellpadding="0" cellspacing="3" border="0">
				<tr>
	<td><img loading="lazy" decoding="async" class="inlineimg" src="http://www.cyberforum.ru//cyberstatic.net/images/attach/zip.gif" alt="Тип файла: zip" width="16" height="16" border="0" style="vertical-align:baseline" /></td>
	<td><a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=5242&amp;d=1551462866">Клеточный_автомат_(Жизнь)v5.zip</a> (138.5 Кб, 647 просмотров)</td>
</tr>
				</table>
			</fieldset>
		

	</div>
<!-- / attachments -->
]]></content:encoded>
			<dc:creator>bedvit</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/829006/5718.html</guid>
		</item>
		<item>
			<title>Библиотека COM (OLE Automation). Часть 1 - ArraySort (String)</title>
			<link>https://www.cyberforum.ru/blogs/829006/5534.html</link>
			<pubDate>Tue, 13 Nov 2018 18:46:07 GMT</pubDate>
			<description>Теперь часть библиотеки BedvitCOM (https://www.cyberforum.ru/blogs/829006/blog5958.html). 
См....</description>
			<content:encoded><![CDATA[<div>Теперь часть библиотеки <a href="https://www.cyberforum.ru/blogs/829006/blog5958.html">BedvitCOM</a>.<br />
<a href="https://www.cyberforum.ru/blogs/829006/blog5983.html">См. Часть 2.</a><br />
Решил запустить пробный шар, и если будет время и интерес к данной тематике, возможно сделаю что-то годное в своих COM и XLL библиотеках.<br />
Цель - скорость и удобство работы, создание для скриптовых языков, языков с поддержкой COM - того, чего там нет или есть, но хочется лучше.<br />
В данном момент ориентир на VBA.<br />
Добавил <b>новый класс - &quot;VBA&quot;</b> к двум уже существующим (см. ссылку выше).<br />
Добавил <b>новый метод - &quot;ArraySortS&quot; - сортировка данных (String) в одномерном/двухмерном массиве.</b> С выводом индексов, сортировка возможна практически в <b>любой размерности</b>, если сортировать по первым двум измерениям) + <b>удаление дубликатов.</b><br />
<s>На порядок быстрее QuickSort на массивах VBA.</s> <b>до 35 раз!</b><br />
COM упакована в XLL (распаковывается и регистрируется автоматом).<br />
Открываем XLL, пишем код в VBA - пользуемся.<br />
<br />
<b>26/11/2018 - Обновления функционала:</b><br />
<b><i>1.Сортировка одномерных и двухмерных массивов<br />
2.Удаление дубликатов в одномерных массивах<br />
3.Вывод по одномерному и двухмерному массивам индексов по строкам или столбцам.<br />
4.Сортировка по столбцам, строкам, целому массиву с выводом строки/столбцы, столбцы/строки.<br />
5.Сортировка по 3 ключам (столбцам, строкам)<br />
6.Размерность массива может быть любой, в т.ч. и с минусовых значений -5+0+5... и т.д. (вывод индексов в такой же размерности)<br />
7.Обработка NULL - строк (перемещение на последние позиции)<br />
8.Использованы <a rel="nofollow noopener noreferrer" href="https://learn.microsoft.com/ru-RU/cpp/parallel/concrt/parallel-algorithms?view=msvc-140" target="_blank" title="https://learn.microsoft.com/ru-RU/cpp/parallel/concrt/parallel-algorithms?view=msvc-140">параллельные алгоритмы сортировки.</a></i></b> (библиотеки PPL, костыли не прикручивал)<br />
<br />
<br />
Интерфейс класса:<br />
<div class="codeblock"><table class="cpp"><thead><tr><td colspan="2" id="571297546"  class="head">C++</td></tr></thead><tbody><tr class="li1"><td><div id="571297546" style="height: 110px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
</pre></td><td class="de1"><pre class="de1">interface IVBA <span class="sy4">:</span> IDispatch
<span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="br0">&#91;</span>id<span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>, helpstring<span class="br0">&#40;</span><span class="st0">&quot;Array sort&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span> HRESULT ArraySortS<span class="br0">&#40;</span><span class="br0">&#91;</span>in, out<span class="br0">&#93;</span> VARIANT<span class="sy2">*</span> array_in_out, <span class="br0">&#91;</span>in,defaultvalue<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#93;</span> VARIANT_BOOL sort_order, <span class="br0">&#91;</span>in, defaultvalue<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#93;</span> LONG key_1, <span class="br0">&#91;</span>in, defaultvalue<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#93;</span> LONG key_2, <span class="br0">&#91;</span>in, defaultvalue<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#93;</span> LONG key_3, <span class="br0">&#91;</span>in, defaultvalue<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#93;</span> &nbsp;LONG sort_orientation, &nbsp;<span class="br0">&#91;</span>in, defaultvalue<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#93;</span> &nbsp;VARIANT_BOOL delete_duplicates,<span class="br0">&#91;</span>in, defaultvalue<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#93;</span> &nbsp;VARIANT_BOOL out_array_index, <span class="br0">&#91;</span>in, out, defaultvalue<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#93;</span> VARIANT<span class="sy2">*</span> index_array_out<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
<span class="br0">&#125;</span><span class="sy4">;</span></pre></td></tr></table></div></td></tr></tbody></table></div>Параметры метода:<br />
1.<b>array_in_out</b> - указатель на массив (ввод/вывод)<br />
2.<b>sort_order</b> - порядок сортировки : 0-по возрастанию, 1-по убыванию<br />
3.<b>key_1</b> - ключи сортировки (порядковый номер столбца/строки, начиная с 1) по умолчанию - первый столбец/строка<br />
4.<b>key_2</b><br />
5.<b>key_3</b><br />
6.<b>sort_orientation</b> - ориентация сортировки (0 - по строкам, 1 - по столбцам, 2- целый массив вывод строка-столбец, 3- целый массив вывод столбец-строка)<br />
7.<b>delete_duplicates</b> - удаляем дубликаты (в одномерных массивах)<br />
8.<b>out_array_index</b> - выводим индексы, &quot;булево&quot; 1/0 (тогда основной массив array_in_out - не меняется, выводятся данные в index_array_out )<br />
9.<b>index_array_out</b> - одномерный массив с индексами (с учетом всех ключей), если задан out_array_index=1<br />
<br />
Все параметры метода, кроме входящего массива - опциональные (с значениями по умолчанию - 0 (ключи-1))<br />
Метод &quot;ArraySortS&quot; работает через Variant, т.к. на некоторых скриптовых языках SAFEARRAY ходит через границы COM, только в обертке VARIANT (без изобретения костылей).<br />
 <br />
<b>Пример тестирования и использования в VBA (элементарно через CreateObject(&quot;BedvitCOM.VBA&quot;)):</b><br />

			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   <div class="codeblock"><table class="vb"><thead><tr><td colspan="2" id="992264581"  class="head">Visual Basic</td></tr></thead><tbody><tr class="li1"><td><div id="992264581" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
</pre></td><td class="de1"><pre class="de1"><span class="kw2">Sub</span> Test_arr_sort()
<span class="co1">'Dim bVBA As BedvitCOM.VBA: Set a = New BedvitCOM.VBA 'ранее связывание</span>
<span class="kw4">Dim</span> bVBA <span class="kw4">As</span> <span class="kw1">Object</span>: <span class="kw4">Set</span> bVBA = <span class="kw2">CreateObject</span>(<span class="st0">&quot;BedvitCOM.VBA&quot;</span>) <span class="co1">'позднее связывание</span>
<span class="kw4">Dim</span> testSize <span class="kw4">As</span> <span class="kw1">Long</span>: testSize = 2000000
<span class="kw4">Dim</span> arr_index, arrTmp, i <span class="kw4">As</span> <span class="kw1">Long</span>, J <span class="kw4">As</span> <span class="kw1">Long</span>, t
&nbsp;
<span class="co1">''''''''''''1х массив'''''''''''''''''''''''</span>
<span class="kw4">Dim</span> Arr1: <span class="kw4">ReDim</span> Arr1(-5 <span class="kw3">To</span> testSize) <span class="kw4">As</span> <span class="kw1">String</span>
<span class="kw4">Dim</span> Arr2: <span class="kw4">ReDim</span> Arr2(-5 <span class="kw3">To</span> testSize, -2 <span class="kw3">To</span> 3) <span class="kw4">As</span> <span class="kw1">String</span>
&nbsp;
<span class="co1">'arr(5) - NULL - проверка для сортировки пустых</span>
Arr1(6) = 0
Arr1(7) = <span class="st0">&quot;Test_arr_sort&quot;</span>
<span class="kw3">For</span> i = 8 <span class="kw3">To</span> testSize
&nbsp; Arr1(i) = Format$(Int(Rnd * testSize), <span class="st0">&quot;0000000&quot;</span>) <span class="co1">'30% дубликатов</span>
<span class="kw3">Next</span>
&nbsp;
arrTmp = Arr1 <span class="co1">'!</span>
t = Timer
bVBA.ArraySortS arrTmp
Debug.<span class="kw4">Print</span> <span class="st0">&quot;Простая сорт. 1х массива, по возрастанию (по умолч.): &quot;</span> &amp; Timer - t &amp; <span class="st0">&quot; сек.&quot;</span>
&nbsp;
arrTmp = Arr1 <span class="co1">'!!</span>
t = Timer
bVBA.ArraySortS arrTmp, 1, , , , , 1, 0, 0
Debug.<span class="kw4">Print</span> <span class="st0">&quot;Простая сорт.по убыванию 1x массива с удалением&quot;</span> &amp; ((<span class="kw4">UBound</span>(arrTmp) - <span class="kw4">LBound</span>(arrTmp)) / (testSize - <span class="kw4">LBound</span>(arrTmp)) - 1) * 100 &amp; <span class="st0">&quot;%: &quot;</span> &amp; Timer - t &amp; <span class="st0">&quot; сек.&quot;</span>
&nbsp;
<span class="co1">'arrTmp = arr - начальный массив не меняется, поэтому темповый - не нужен '!</span>
t = Timer
bVBA.ArraySortS Arr1, 1, , , , , , 1, arr_index
Debug.<span class="kw4">Print</span> <span class="st0">&quot;Вывод индексов для 1х массива, сортировка по убыванию:&quot;</span> &amp; Timer - t &amp; <span class="st0">&quot; сек.&quot;</span>
&nbsp;
<span class="co1">''''''''''''2х массив'''''''''''''''''''''''</span>
<span class="co1">'arr(5) - NULL - проверка для сортировки пустых</span>
Arr2(6, 2) = 0
Arr2(7, 2) = <span class="st0">&quot;Test_arr_sort&quot;</span>
<span class="kw3">For</span> i = 8 <span class="kw3">To</span> testSize
&nbsp; &nbsp; <span class="kw3">For</span> J = -2 <span class="kw3">To</span> 3
&nbsp; &nbsp; &nbsp; &nbsp; Arr2(i, J) = Format$(Int(Rnd * testSize), <span class="st0">&quot;0000000&quot;</span>) <span class="co1">'30% дубликатов</span>
 &nbsp; &nbsp;<span class="kw3">Next</span>
<span class="kw3">Next</span>
&nbsp;
arrTmp = Arr2 <span class="co1">'!</span>
t = Timer
bVBA.ArraySortS arrTmp, 0, , , , 2, 0, 0, 0
Debug.<span class="kw4">Print</span> <span class="st0">&quot;Сортировка всего 2х массива - вывод строка-столбец: &quot;</span> &amp; Timer - t &amp; <span class="st0">&quot; сек.&quot;</span>
&nbsp;
arrTmp = Arr2 <span class="co1">'!</span>
t = Timer
bVBA.ArraySortS arrTmp, 0, 5, , , 3, 0, 0, 0
Debug.<span class="kw4">Print</span> <span class="st0">&quot;Сортировка всего 2х массива - вывод столбец-строка &quot;</span> &amp; Timer - t &amp; <span class="st0">&quot; сек.&quot;</span>
&nbsp;
arrTmp = Arr2 <span class="co1">'!</span>
t = Timer
bVBA.ArraySortS arrTmp
Debug.<span class="kw4">Print</span> <span class="st0">&quot;Простая сортировка 2х массива: &quot;</span> &amp; Timer - t &amp; <span class="st0">&quot; сек.&quot;</span>
&nbsp;
arrTmp = Arr2 <span class="co1">'!</span>
t = Timer <span class="co1">'!</span>
bVBA.ArraySortS arrTmp, 0, 3, , , , , 1, arr_index
Debug.<span class="kw4">Print</span> <span class="st0">&quot;Вывод индексов для 2х массива, по указанному столбцу: &quot;</span> &amp; Timer - t &amp; <span class="st0">&quot; сек.&quot;</span>
&nbsp;
arrTmp = Arr2 <span class="co1">'!</span>
t = Timer
bVBA.ArraySortS arrTmp, 0, 5, , , 1, 0, 0, 0
Debug.<span class="kw4">Print</span> <span class="st0">&quot;Сортировка 2х массива по 5му столбцу: &quot;</span> &amp; Timer - t &amp; <span class="st0">&quot; сек.&quot;</span>
&nbsp;
arrTmp = Arr2 <span class="co1">'!</span>
t = Timer <span class="co1">'!</span>
bVBA.ArraySortS arrTmp, 0, 8, , , 1, , 1, arr_index
Debug.<span class="kw4">Print</span> <span class="st0">&quot;Вывод индексов для 2х массива, по 8й строке: &quot;</span> &amp; Timer - t &amp; <span class="st0">&quot; сек.&quot;</span>
&nbsp;
arrTmp = Arr2 <span class="co1">'!</span>
t = Timer
bVBA.ArraySortS arrTmp, 0, 8, , , 1, 0, 0, 0
Debug.<span class="kw4">Print</span> <span class="st0">&quot;Сортировка 2х массива по 8й строке: &quot;</span> &amp; Timer - t &amp; <span class="st0">&quot; сек.&quot;</span>
&nbsp;
arrTmp = Arr2 <span class="co1">'!</span>
t = Timer
bVBA.ArraySortS arrTmp, 0, 1, 2, 3, 0, , 1, arr_index
Debug.<span class="kw4">Print</span> <span class="st0">&quot;Вывод индексов для 2х массива, по 1,2,3му столбцу: &quot;</span> &amp; Timer - t &amp; <span class="st0">&quot; сек.&quot;</span>
&nbsp;
arrTmp = Arr2 <span class="co1">'!</span>
t = Timer
bVBA.ArraySortS arrTmp, 0, 1, 2, 3, 0, 0, 0, 0
Debug.<span class="kw4">Print</span> <span class="st0">&quot;Сортировка 2х массива по 1,2,3му столбцу: &quot;</span> &amp; Timer - t &amp; <span class="st0">&quot; сек.&quot;</span>
&nbsp;
arrTmp = Arr2 <span class="co1">'!</span>
t = Timer
bVBA.ArraySortS arrTmp, 0, 8, 9, 10, 1, 0, 1, arr_index
Debug.<span class="kw4">Print</span> <span class="st0">&quot;Вывод индексов для 8,9,10й строке: &quot;</span> &amp; Timer - t &amp; <span class="st0">&quot; сек.&quot;</span>
&nbsp;
arrTmp = Arr2 <span class="co1">'!</span>
t = Timer
bVBA.ArraySortS arrTmp, 0, 8, 9, 10, 1, 0, 0, 0
Debug.<span class="kw4">Print</span> <span class="st0">&quot;Сортировка 2х массива по 8,9,10й строке: &quot;</span> &amp; Timer - t &amp; <span class="st0">&quot; сек.&quot;</span>
&nbsp;
<span class="kw4">Set</span> bVBA = <span class="kw5">Nothing</span>
<span class="kw3">End</span> <span class="kw2">Sub</span></pre></td></tr></table></div></td></tr></tbody></table></div>
				   </div>
			   </div><br />
<br />
<b>Результаты на 2-х млн. строк и 4-м столбцам:</b><br />
<br />
Алгоритмы в VBA (быстрейшее решения, для сравнения): <br />
<b>QuickSort на VBA (простая сортировка одномерного массива) -6.8 сек.</b><br />

			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   <div class="codeblock"><table class="vb"><thead><tr><td colspan="2" id="556437082"  class="head">Visual Basic</td></tr></thead><tbody><tr class="li1"><td><div id="556437082" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
</pre></td><td class="de1"><pre class="de1"><span class="kw2">Option</span> <span class="kw2">Explicit</span>
Const testSize = 2000000
<span class="kw4">Dim</span> a(testSize), x$, y$
&nbsp;
<span class="kw2">Sub</span> test()
<span class="kw4">Dim</span> i&amp;
<span class="kw3">For</span> i = 0 <span class="kw3">To</span> testSize
&nbsp; a(i) = Format$(Int(Rnd * testSize), <span class="st0">&quot;0000000&quot;</span>)
<span class="kw3">Next</span>
&nbsp;
<span class="kw4">Dim</span> t#
t = Timer
QuickSort 0, testSize
Debug.<span class="kw4">Print</span> Timer - t
&nbsp;
<span class="kw3">End</span> <span class="kw2">Sub</span>
&nbsp;
<span class="kw2">Sub</span> QuickSort(<span class="kw4">ByVal</span> L <span class="kw4">As</span> <span class="kw1">Long</span>, <span class="kw4">ByVal</span> U <span class="kw4">As</span> <span class="kw1">Long</span>)
<span class="kw4">Dim</span> i <span class="kw4">As</span> <span class="kw1">Long</span>, j <span class="kw4">As</span> <span class="kw1">Long</span>
i = L: j = U: x = a((L + U) \ 2)
<span class="kw3">Do</span>
&nbsp; <span class="kw3">While</span> a(i) &lt; x: i = i + 1: Wend: <span class="kw3">While</span> x &lt; a(j): j = j - 1: Wend <span class="co1">'по возрастанию</span>
<span class="co1">' &nbsp;While A(I) &gt; X: I = I + 1: Wend: While X &gt; A(J): J = J - 1: Wend 'по убыванию</span>
 &nbsp;<span class="kw3">If</span> i &lt;= j <span class="kw3">Then</span>
&nbsp; &nbsp; y = a(i): a(i) = a(j): a(j) = y: &nbsp; &nbsp;i = i + 1: j = j - 1
&nbsp; <span class="kw3">End</span> <span class="kw3">If</span>
<span class="kw3">Loop</span> <span class="kw3">Until</span> i &gt; j
<span class="kw3">If</span> L &lt; j <span class="kw3">Then</span> QuickSort L, j
<span class="kw3">If</span> i &lt; U <span class="kw3">Then</span> QuickSort i, U
<span class="kw3">End</span> <span class="kw2">Sub</span></pre></td></tr></table></div></td></tr></tbody></table></div>
				   </div>
			   </div><br />
<br />
Метод <b>ArraySortS</b> из класса BedvitCOM.VBA (тестовый стенд: ЦП-QuadCore Intel Core i7-3770, ОЗУ-16ГБ (DDR3-1600 DDR3 SDRAM), WIN7x64, MS Office2016x64):   <br />
<b>Простая сорт. 1х массива, по возрастанию (по умолч.): 0,21875 сек.</b><br />
Простая сорт.по убыванию 1x массива с удалением-34,5385136537159%: 0,3515625 сек.<br />
Вывод индексов для 1х массива, сортировка по убыванию:0,2460938 сек.<br />
Сортировка всего 2х массива - вывод строка-столбец: 1,75 сек.<br />
Сортировка всего 2х массива - вывод столбец-строка 1,78125 сек.<br />
Простая сортировка 2х массива: 0,390625 сек.<br />
Вывод индексов для 2х массива, по указанному столбцу: 0,28125 сек.<br />
Сортировка 2х массива по 5му столбцу: 0,05078125 сек.<br />
Вывод индексов для 2х массива, по 8й строке: 0 сек.<br />
Сортировка 2х массива по 8й строке: 0,05078125 сек.<br />
Вывод индексов для 2х массива, по 1,2,3му столбцу: 1,484375 сек.<br />
Сортировка 2х массива по 1,2,3му столбцу: 1,519531 сек.<br />
Вывод индексов для 8,9,10й строке: 0 сек.<br />
Сортировка 2х массива по 8,9,10й строке: 0,05078125E сек.<br />
<br />
<b>18/02/2018 - добавил СОМ-библиотеки</b><br />
Для возможности использовать данную сортировку в СОМ-поддерживающих программах.<br />
Регистрация COM реализовано как под админом, так и под пользователем (актуально в офисной части клиентов)<br />
Регистрация стандартная:<br />
Админ: <b>Regsvr32 &quot;FullName.DLL&quot;</b> !ПОМНИМ! В Win10 регистрация под правами админа: &quot;правая кнопка&quot; - &quot;Пуск&quot; -&quot;Командная строка (администратор)&quot;<br />
Пользователь: <b>Regsvr32 /i /n &quot;FullName.DLL&quot;</b><br />
Удалить из реестра: <b>Regsvr32 /u &quot;FullName.DLL&quot;</b><br />
<br />
<a href="https://www.cyberforum.ru/blogs/829006/blog5958.html">Последние версии библиотек.</a></div>


<!-- attachments -->
	<div style="margin-top:10px">

		
			<fieldset class="fieldset">
				<legend>Миниатюры</legend>
				<div style="padding:3px">
				
	<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=5523&amp;d=1566915872" target="attachment" rel="Lightbox" id="attachment5523"><img loading="lazy" decoding="async" class="thumbnail" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=5523&amp;stc=1&amp;thumb=1&amp;d=1566915872" border="0" alt="Нажмите на изображение для увеличения
Название: BedvitCOM_VBA1.PNG
Просмотров: 461
Размер:	90.1 Кб
ID:	5523" /></a>
	&nbsp;
	

				</div>
			</fieldset>
		
		
		
		
			<fieldset class="fieldset">
				<legend>Вложения</legend>
				<table cellpadding="0" cellspacing="3" border="0">
				
				</table>
			</fieldset>
		

	</div>
<!-- / attachments -->
]]></content:encoded>
			<dc:creator>bedvit</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/829006/5534.html</guid>
		</item>
		<item>
			<title>Длинная арифметика (Bignum arithmetic) c COM-интерфейсом и C API Functions для Excel на библиотеках MPIR. С/С++</title>
			<link>https://www.cyberforum.ru/blogs/829006/5196.html</link>
			<pubDate>Mon, 26 Mar 2018 19:15:01 GMT</pubDate>
			<description>Теперь часть библиотеки BedvitCOM (https://www.cyberforum.ru/blogs/829006/blog5958.html). 
*Проект...</description>
			<content:encoded><![CDATA[<div>Теперь часть библиотеки <a href="https://www.cyberforum.ru/blogs/829006/blog5958.html">BedvitCOM</a>.<br />
<b><i>Проект основан на исходниках (на С++) библиотеки <a rel="nofollow noopener noreferrer" href="https://github.com/wbhart/mpir" target="_blank" title="https://github.com/wbhart/mpir">MPIR, Edition 3.0.0.</a> (на основе библиотеки <a rel="nofollow noopener noreferrer" href="https://gmplib.org/" target="_blank" title="https://gmplib.org/">GMP</a>)</i></b><br />
Полностью написан на С/С++.<br />
Скорость на порядок выше <a href="https://www.cyberforum.ru/blogs/829006/blog4356.html">предыдущего решения</a>.<br />
Реализовал два блока в проекте:<br />
<br />
<b>1.DLL c COM интерфейсом.</b> Реализованы dual-интерфейсы с Automation-совместимыми типами данных, структур<br />
(поддержка как раннего вывязывания, так и позднего). Ранний предпочтительнее в части скорости (на 50% быстрее передача данных через СОМ-обертку).<br />
Реализовано два класса: класс целых чисел с арифметикой (BignumArithmeticInteger) и класс чисел с плавающей точкой (BignumArithmeticFloat). При создании экземпляра класса создается массив <s>из 256 чисел с арифметикой</s> начиная с BedvitCOM v.2.0.0.0 - в массиве создается только 0-й элемент, с возможностью неограниченного добавления остальных чисел - пользователями. Массив начинается с 0. 0-й элемент инициализирован сраз нулем. Остальные числа добавляются автоматически в массив по их индексу, при присвоении им какого-либо значения пользователем (инициализации).<br />
К числам можно обращаться по индексам (можно переменной присвоить индекс и работать с переменными, см. пример ниже)<br />
BignumArithmeticInteger (Bignum) увеличивается в памяти по мере расчета автоматически, перераспределяя память.<br />
BignumArithmeticFloat (Bignum), задается изначально, т.к. дробь может быть бесконечной (по умолчанию принимается минимальный размер - double).<br />
Размер чисел ничем не ограничен, кроме вашей оперативки.<br />
<br />
Регистрация COM реализовано как под админом, так и под пользователем (актуально в офисной части клиентов)<br />
Регистрация стандартная:<br />
Админ: <b>Regsvr32 &quot;FullName.DLL&quot;</b> !ПОМНИМ! В Win10 регистрация под правами админа: &quot;правая кнопка&quot; - &quot;Пуск&quot; -&quot;Командная строка (администратор)&quot;<br />
Пользователь: <b>Regsvr32 /i /n &quot;FullName.DLL&quot;</b><br />
Удалить из реестра: <b>Regsvr32 /u &quot;FullName.DLL&quot;</b><br />
<br />
<b>Свойства и методы последней версии библиотеки COM (из .Help):</b><br />
<b>Свойства и Методы BignumArithmeticInteger</b><br />
<br />
1.Help(); HTML Справка (без параметров).<br />
<br />
2.BSTR* StringBSTR = Bignum(BYTE Bignum, LONG BignumBase=10) = BSTR* StringBSTR ; Свойство. Принимает и возвращает BSTR* строку StringBSTR (задает число или возвращает значение). Bignum-индекс длинного числа в массиве (0-255). BignumBase-база длинного числа (от 2 до 36), по умолчанию = 10.<br />
<br />
3.LONG Val = Sign(BYTE Bignum); Свойство. Возвращает знак длинного числа LONG Val.Возвращает 1 если Bignum &gt; 0, 0 если Bignum = 0, и -1 если Bignum &lt; 0.<br />
<br />
4.LONG Val = Even(BYTE Bignum); Свойство. Определяет, является ли Bignum четное или нечетное. Возвращает 1 - Bignum четное, 0 - Bignum нечетное.<br />
<br />
5.LONG Val = Compare(BYTE Bignum1, BYTE Bignum2); Метод. Сравнивает два длинных числа. Возвращает 1 если Bignum1 &gt; Bignum2, 0 если Bignum1 = Bignum2, и -1 если Bignum1 &lt; Bignum2.<br />
<br />
6.BignumSet(BYTE Bignum, BSTR StringBSTR, LONG BignumBase=10); Метод. Задает число с параметрами аналогичными свойству Bignum()<br />
<br />
7.Sum(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Суммирует два длинных числа. BignumSet = Bignum1 + Bignum2<br />
 <br />
8.SumL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Суммирует длинное число с обычным. BignumSet = Bignum1 + LONG_PTR(х64:LONG_PTR= LONGLONG, х32:LONG_PTR= LONG) <br />
<br />
9.Abs(BYTE BignumSet, BYTE Bignum1); Метод. Возвращает модуль значения из Bignum1 в BignumSet.<br />
<br />
10.Negate(BYTE BignumSet, BYTE Bignum1); Метод. Возвращает значение с противоположным знаком из Bignum1 в BignumSet. BignumSet = - Bignum1.<br />
<br />
11.Subtract(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Вычитает из одного длинного числа второе. BignumSet = Bignum1 - Bignum2<br />
<br />
12.SubtractL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Вычитает из длинного числа обычное. BignumSet = Bignum1 - LONG_PTR.<br />
<br />
13.Multiply(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Умножает одно длинное число на второе. BignumSet = Bignum1 * Bignum2.<br />
<br />
14.MultiplyL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Умножает длинное число на обычное. BignumSet = Bignum1 * LONG_PTR.<br />
<br />
15.Divide(BYTE BignumQuotient, BYTE BignumRemainder, BYTE Bignum1, BYTE Bignum2); Метод. Делит одно длинное число на второе. При делении получаем частное в BignumQuotient, остаток от деления в BignumRemainder = Bignum1 / Bignum2.<br />
<br />
16.DivideL(BYTE BignumQuotient, BYTE BignumRemainder, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Делит длинное число на обычное. При делении получаем частное в BignumQuotient, остаток от деления в BignumRemainder = Bignum1 / LONG_PTR.<br />
<br />
17.Power(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Возводит в степень LONG_PTR длинное число Bignum1, результат возвращает в BignumSet. BignumSet = Bignum1 ^ LONG_PTR.<br />
<br />
18.Clone(BYTE BignumSet, BYTE Bignum1); Метод. Копирует Bignum1 в BignumSet. BignumSet = Bignum1<br />
<br />
19.RootRem(BYTE BignumRoot, BYTE BignumRemainder, BYTE Bignum1, LONG_PTR n_root); Метод. Извлекает корень n_root-степени из Bignum1. Целочисленный результат возвращает в BignumRoot, остаток в BignumRemainder = (n-th root)√ Bignum1.<br />
<br />
20.Factorial(BYTE BignumSet, LONG n); Метод. Возвращает в BignumSet факториал n!<br />
<br />
21.Fibonacci(BYTE BignumSet, LONG_PTR n); Метод. Возвращает в BignumSet число Фибоначи n. Fn+1 = Fn + Fn-1<br />
<br />
22.LucNum(BYTE BignumSet, LONG_PTR n); Метод. Возвращает в BignumSet число Лукоса n. Ln+1 =Ln + Ln-1<br />
<br />
23.FileSet(BYTE Bignum, BSTR StringBSTRFileName, LONG BignumBase=10); Метод. Загружает длинное число из файла (*.txt). Принимает BSTR* строку StringBSTRFileName в качестве полного пути и имени файла. Bignum-индекс длинного числа в массиве (0-255). BignumBase-база числа (от 2 до 36), по умолчанию = 10.<br />
<br />
24.FileGet(BYTE Bignum, BSTR StringBSTRFileName, LONG BignumBase=10); Метод. Сохраняет длинное число в файл (*.txt). Принимает BSTR* строку StringBSTRFileName в качестве полного пути и имени файла. Bignum-индекс длинного числа в массиве (0-255). BignumBase-база числа (от 2 до 36), по умолчанию = 10.<br />
<br />
25.Clear(LONG Bignum=-1); Метод. Освобождает память занятую длинным числом Bignum, или освобождает память занятую всеми числами при заданном параметре по умолчанию = -1.<br />
<br />
26.LONG Val = BignumArraySize(); Метод. Возвращает количество чисел Bignum в созданном классе/массиве. Начиная с v2.0.0.0 (теперь массив чисел может быть произвольного размера, а не как ранее 256 чисел. Размер увеличиваться автоматически.)<br />
<br />
<br />
 <br />
<b>Свойства и Методы BignumArithmeticFloat</b><br />
<br />
1.Help(); HTML Справка (без параметров).<br />
<br />
2.LONG Val = SizeBits(BYTE Bignum, LONG_PTR* pVal) = .LONG Val; Свойство. Задает и возвращает размер длинного числа в БИТАХ LONG Val. Bignum-индекс длинного числа в массиве (0-255).<br />
<br />
3.BSTR* String = Bignum(BYTE Bignum, LONG BignumBase=10, LONG_PTR Precision=0, BSTR Separator=”.”, VARIANT_BOOL Exponential=-1) = BSTR* String; Свойство. Принимает и возвращает BSTR* строку String (задает число или возвращает значение). Bignum-индекс длинного числа в массиве (0-255). BignumBase-база длинного числа (от 2 до 36), по умолчанию = 10. Precision – точность (кол-во цифр в числе), по умолчанию = 0 - максимальная (равна заданному размеру в битах). Separator – символ разделителя целой и дробной частей числа, по умолчанию точка(“.”). Exponential – по умолчанию =-1 экспоненциальная запись, 0 – десятичная (в разработке).<br />
<br />
(При парсинге строки в число, ожидаемая десятичная точка берется из текущей локали, на системах, предоставляющих localeconv).<br />
<br />
4.LONG Val = Sign(BYTE Bignum); Свойство. Возвращает знак длинного числа LONG Val.Возвращает 1 если Bignum &gt; 0, 0 если Bignum = 0, и -1 если Bignum &lt; 0.<br />
<br />
5.LONG Val = Compare(BYTE Bignum1, BYTE Bignum2); Метод. Сравнивает два длинных числа. Возвращает 1 если Bignum1 &gt; Bignum2, 0 если Bignum1 = Bignum2, и -1 если Bignum1 &lt; Bignum2.<br />
<br />
6.SizeBitsSet(BYTE Bignum, LONG_PTR SizeBits); Метод. Задает размер длинного числа в БИТАХ LONG Val.<br />
<br />
7.BignumSet(BYTE Bignum, BSTR StringBSTR, LONG BignumBase=10, BSTR Separator=”.”); Метод. Задает число с параметрами аналогичными свойству Bignum().<br />
<br />
8.Sum(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Суммирует два длинных числа. BignumSet = Bignum1 + Bignum2<br />
<br />
9.SumL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Суммирует длинное число с обычным. BignumSet = Bignum1 + LONG_PTR(х64:LONG_PTR= LONGLONG, х32:LONG_PTR= LONG)<br />
<br />
10.Abs(BYTE BignumSet, BYTE Bignum1); Метод. Возвращает модуль значения из Bignum1 в BignumSet.<br />
<br />
11.Subtract(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Вычитает из одного длинного числа второе. BignumSet = Bignum1 - Bignum2.<br />
<br />
12.SubtractL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Вычитает из длинного числа обычное. BignumSet = Bignum1 - LONG_PTR.<br />
<br />
13.Multiply(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Умножает одно длинное число на второе. BignumSet = Bignum1 * Bignum2.<br />
<br />
14.MultiplyL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Умножает длинное число на обычное. BignumSet = Bignum1 * LONG_PTR.<br />
<br />
15.Divide(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Делит одно длинное число на второе. BignumSet = Bignum1 / Bignum2<br />
<br />
16.DivideL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Делит длинное число на обычное. BignumSet = Bignum1 / LONG_PTR.<br />
<br />
17.Root(BYTE BignumSet, BYTE Bignum1); Метод. Извлекает квадратный корень из Bignum1. Результат возвращает в BignumSet. BignumSet = √ Bignum1.<br />
<br />
18.Negate(BYTE BignumSet, BYTE Bignum1); Метод. Возвращает значение с противоположным знаком из Bignum1 в BignumSet. BignumSet = - Bignum1.<br />
<br />
19.Power(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Возводит в степень LONG_PTR длинное число Bignum1, результат возвращает в BignumSet. BignumSet = Bignum1 ^ LONG_PTR.<br />
<br />
20.Clone(BYTE BignumSet, BYTE Bignum1); Метод. Копирует Bignum1 в BignumSet. BignumSet = Bignum1<br />
<br />
21.FileSet(BYTE Bignum, BSTR StringBSTRFileName, LONG BignumBase=10); Метод. Загружает длинное число из файла (*.txt). Принимает BSTR* строку StringBSTRFileName в качестве полного пути и имени файла. Bignum-индекс длинного числа в массиве (0-255). BignumBase-база числа (от 2 до 36), по умолчанию = 10.<br />
<br />
(При парсинге строки в число, ожидаемая десятичная точка берется из текущей локали, на системах, предоставляющих localeconv).<br />
<br />
22.FileGet(BYTE Bignum, BSTR StringBSTRFileName, LONG BignumBase=10, LONG_PTR Precision=0); Метод. Сохраняет длинное число в файл (*.txt). Принимает BSTR* строку StringBSTRFileName в качестве полного пути и имени файла. Bignum-индекс длинного числа в массиве (0-255). BignumBase-база числа (от 2 до 36), по умолчанию = 10. Precision – точность (кол-во цифр в числе), по умолчанию = 0 - максимальная (равна заданному размеру в битах).<br />
<br />
23.Clear(LONG Bignum=-1); Метод. Освобождает память занятую длинным числом Bignum, или освобождает память занятую всеми числами при заданном параметре по умолчанию = -1<br />
<br />
24.LONG Val = BignumArraySize(); Метод. Возвращает количество чисел Bignum в созданном классе/массиве. Начиная с v2.0.0.0 (теперь массив чисел может быть произвольного размера, а не как ранее 256 чисел. Размер увеличиваться автоматически.)<br />
<br />
25.BSTR* String = GetToBignumInt(LONG Bignum, LONG BignumBase=10); Метод. Преобразовать Bignum из Float в Integer и вывести. ВАЖНО! преобразование происходит с заданной ранее точностью в битах для Float (SizeBitsSet). Без округлений, отбрасывается дробная часть. Будьте внимательнее в таких преобразованиях. Начиная с v2.0.0.0.<br />
<br />
<br />
<br />
<br />
<br />
<b>2.XLL для Excel с C API функциями.</b> Добавил базовый набор. Будет потребность в дополнительных - добавлю по запросу.<br />
Для функций создано два раздела в стандартном списке с названиями классов в COM (+один общий).<br />
Функции поддерживают многопоточные расчеты.<br />
Работа с функциями как с обычными (различий нет). Обычные написаны тоже на С/С++ под C API.<br />
<br />
<b>Список C API - функций в Excel:</b><br />
1.<i>BedvitXLLBignumArithmeticInteger</i> - функции для работы с длинными целыми числами.<br />
Функции:<br />
1.1 SumInteger() - сложение двух длинных/обычных целых чисел<br />
1.2 SubtractInteger() - вычитание двух длинных/обычных целых чисел<br />
1.3 MultiplyInteger() - умножение двух длинных/обычных целых чисел<br />
1.4 DivideInteger() - деление двух длинных/обычных целых чисел - Неполное частное<br />
1.5 ModInteger() - деление двух длинных/обычных целых чисел - Остаток от деления<br />
1.6 PowerInteger() - возведение в степень длинного/обычного целого числа<br />
1.7 ConvertBaseInteger() - конвертирование целого числа (строки) из одной базы в другую (от 2 до 36).<br />
1.8 FactorialInteger() - факториал задаваемого числа.<br />
<br />
2.<i>XLLBignumArithmeticFloat</i> - функции для работы с длинными дробными числами.<br />
Функции:<br />
2.1 SumFloat() - сложение двух длинных/обычных чисел с плавающей точкой<br />
2.2 SubtractFloat() - вычитание двух длинных/обычных чисел с плавающей точкой<br />
2.3 MultiplyFloat() - умножение двух длинных/обычных чисел с плавающей точкой<br />
2.4 DivideFloat() - деление двух длинных/обычных чисел с плавающей точкой<br />
2.5 PowerFloat() - возведение в степень длинного/обычного числа<br />
2.6 RootFloat() - извлечение квадратного корня из длинного/обычного числа<br />
<br />
Так же в XLL ресурсы упакована COM.DLL (первый блок проекта), распаковывается и устанавливается под пользователем  - автоматом.<br />
Поэтому открываем XLL или устанавливаем как надстройку - готово (ничего регистрировать не надо).<br />
Пишем код в VBA и работаем. Советую раннее связывание. Видим свойства и методы объекта.<br />
Оные можно посмотреть и в диспетчере объектов (см. рис.)<br />
Т.е. при открытии XLL можно работать как с новыми C API функциями, так и с COM.DLL через VBA.<br />
<br />
Примеры см. ниже.<br />
<br />
Ресурсы:<br />
MPIR library, Edition 3.0.0 (freely distributable librarys)<br />
<a rel="nofollow noopener noreferrer" href="http://mpir.org/" target="_blank" title="http://mpir.org/">http://mpir.org/</a><br />
+ my code written in C / C ++<br />
<br />
©2018, BedvitCOM, BedvitXLL<br />
License: Freely distributable library<br />
<br />
Где тестировалось:<br />
<b><i>Пример №1 (Расширенный): VBA - через индексы, раннее+позднее связывание</i></b>:<div class="codeblock"><table class="vb"><thead><tr><td colspan="2" id="924247027"  class="head">Visual Basic</td></tr></thead><tbody><tr class="li1"><td><div id="924247027" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
</pre></td><td class="de1"><pre class="de1"><span class="co1">'Для раннего связывания сначала включаем в References библиотеку, потом в конце кода отключаем. </span>
<span class="co1">'Для позднего связывания этого не нужно (см.ниже).</span>
<span class="co1">'Sub RUN() 'ЗАПУСКАЕМ ДЛЯ РАННЕГО СВЯЗЫВАНИЯ</span>
<span class="co1">'ThisWorkbook.VBProject.References.AddFromGuid &quot;{77D79CA3-15A0-4310-B8D8-0BCBE3F72D96}&quot;, 1, 0 ' подключаем библиотеку &quot;BedvitCOM&quot; в References VBA</span>
<span class="co1">'Continue 'выполняем нужные команды</span>
<span class="co1">'ThisWorkbook.VBProject.References.Remove ThisWorkbook.VBProject.References(&quot;BedvitCOM&quot;) 'отключаем библиотеку в References VBA</span>
<span class="co1">'End Sub</span>
&nbsp;
<span class="kw2">Sub</span> Continue()
<span class="co1">'раннее связывание</span>
<span class="co1">'Dim I As New BignumArithmeticInteger 'Создаем экземпляр класса - массив целых больших чисел</span>
<span class="co1">'Dim F As New BignumArithmeticFloat &nbsp;'Создаем экземпляр класса - массив больших чисел с плавающей точкой</span>
&nbsp;
<span class="co1">'позднее связывание</span>
<span class="kw4">Dim</span> I <span class="kw4">As</span> <span class="kw1">Object</span>: <span class="kw4">Set</span> I = <span class="kw2">CreateObject</span>(<span class="st0">&quot;BedvitCOM.BignumArithmeticInteger&quot;</span>)
<span class="kw4">Dim</span> F <span class="kw4">As</span> <span class="kw1">Object</span>: <span class="kw4">Set</span> F = <span class="kw2">CreateObject</span>(<span class="st0">&quot;BedvitCOM.BignumArithmeticFloat&quot;</span>)
&nbsp;
I.Bignum(1) = <span class="st0">&quot;111&quot;</span> &amp; <span class="kw1">String</span>$(74, <span class="st0">&quot;1&quot;</span>) <span class="co1">'добавляем число из 103 единиц в первое целое длинное число</span>
I.BignumSet 1, <span class="st0">&quot;111&quot;</span> &amp; <span class="kw1">String</span>$(74, <span class="st0">&quot;1&quot;</span>) <span class="co1">'или так</span>
F.SizeBits(1) = 256 <span class="co1">'задаем размер в битах для 1го числа с плавающей точкой (закрывает точность в 77 символов, для десятичной системы)</span>
F.SizeBits(2) = 256 <span class="co1">'задаем размер в битах для 2го числа с плавающей точкой</span>
F.SizeBits(3) = 256 <span class="co1">'задаем размер в битах для 3го числа с плавающей точкой</span>
F.Bignum(1) = I.Bignum(1) <span class="co1">'копируем данные из одного класса чисел в другой из Integer в Float (из первого в первое)</span>
F.Clone 2, 1 <span class="co1">'копируем в рамках одного класса число из первого во второе, т.е. число 2 = числу 1 (в рамках одного класса такое копирование на порядки быстрее)</span>
F.Sum 3, 2, 1 <span class="co1">'суммируем в 3е число первое и второе: число3 = число2 + число1</span>
<span class="co1">'логика всей арифметики в классах предполагает получение результата в первом параметре(левой части выражения) по аналогии с &quot;x =...&quot;</span>
Debug.<span class="kw4">Print</span> F.Bignum(3) <span class="co1">'смотрим результат в третьем числе Float</span>
<span class="co1">'2.2222222222222222222222222222222222222222222222222222222222222222222222222222E+76 (помещается в 256 бит для возможности перевести в Float, без потери точности)</span>
I.Bignum(3) = F.GetToBignumInt(3) <span class="co1">'преобразование (без округлений, отбрасывается дробная часть) и копирование из Float в Integer с !!!заданной ранее точностью SizeBits!!! &nbsp;Задавайте нужную точность сразу в BignumArithmeticFloat.</span>
Debug.<span class="kw4">Print</span> I.Bignum(3) <span class="co1">'смотрим результат в третьем числе Integer</span>
I.Help <span class="co1">'смотрим Help</span>
F.FileGet 3, <span class="st0">&quot;C:\1.txt&quot;</span> <span class="co1">'сохраняем 3-е число в файл &quot;C:\1.txt&quot;</span>
<span class="co1">'F.Clear 1 'освобождаем память для 1-го числа объекта F (число =0), начиная с BedvitCOM v.2.0.0.0 - это не обязательная команда.</span>
<span class="co1">'F.Clear 'освобождаем память для всего объекта F (число =0), начиная с BedvitCOM v.2.0.0.0 - это не обязательная команда.</span>
<span class="co1">'I.Clear 'освобождаем память для всего объекта I (число =0), начиная с BedvitCOM v.2.0.0.0 - это не обязательная команда.</span>
<span class="kw3">End</span> <span class="kw2">Sub</span></pre></td></tr></table></div></td></tr></tbody></table></div><b><i>Пример №2: 1С </i></b><div class="codeblock"><table class="_1c"><thead><tr><td colspan="2" id="728103009"  class="head">1C</td></tr></thead><tbody><tr class="li1"><td><div id="728103009" style="height: 158px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
</pre></td><td class="de1"><pre class="de1">F <span class="sy0">=</span> Новый COMОбъект<span class="br0">&#40;</span><span class="st0">&quot;BedvitCOM.BignumArithmeticDouble&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//Создаем массив больших чисел с плавающей точкой и арифметикой (класс)</span>
F<span class="sy0">.</span><span class="me1">SizeBitsSet</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">256</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//задаем размер в битах для 1го числа с плавающей точкой</span>
F<span class="sy0">.</span><span class="me1">SetBignum</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="sy0">,</span> <span class="st0">&quot;11111&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//присваиваем данные для 1го числа</span>
F<span class="sy0">.</span><span class="me1">Power</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">51561</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//возводим в степень 51561 первое число и кладем его в первое же число.</span>
f <span class="sy0">=</span> F<span class="sy0">.</span><span class="me1">Bignum</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//кладем данные в переменную из первого числа</span>
Сообщить<span class="br0">&#40;</span>f<span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//смотрим</span>
F<span class="sy0">.</span><span class="me1">Help</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//смотрим Help</span>
F<span class="sy0">.</span><span class="me1">Clear</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span> 'освобождаем память первого числа</pre></td></tr></table></div></td></tr></tbody></table></div><br />
<b><i>Пример №3 (Простой): VBA - через буквенное обозначение, позднее связывание</i></b><div class="codeblock"><table class="vb"><thead><tr><td colspan="2" id="778999774"  class="head">Visual Basic</td></tr></thead><tbody><tr class="li1"><td><div id="778999774" style="height: 158px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
</pre></td><td class="de1"><pre class="de1"><span class="kw4">Dim</span> A, B, C: A = 1: B = 2: C = 3
<span class="kw4">Dim</span> I <span class="kw4">As</span> <span class="kw1">Object</span>: <span class="kw4">Set</span> I = <span class="kw2">CreateObject</span>(<span class="st0">&quot;BedvitCOM.BignumArithmeticInteger&quot;</span>) <span class="co1">'Создаем массив целых больших чисел и арифметикой (класс)</span>
I.BignumSet A, <span class="st0">&quot;12324344435654132546546546564453131&quot;</span> <span class="co1">'задаем данные в число A</span>
I.BignumSet B, <span class="st0">&quot;34534534546546546546554665513213211&quot;</span> <span class="co1">'задаем данные в число B</span>
I.BignumSet C, <span class="st0">&quot;0&quot;</span> <span class="co1">'задаем данные в число B</span>
I.Sum C, A, B <span class="co1">'C=A+B</span>
Debug.<span class="kw4">Print</span> I.Bignum(C) <span class="co1">'смотрим</span>
I.Help 'смотрим Help</pre></td></tr></table></div></td></tr></tbody></table></div><br />
<b><i>Пример №4: 1С - через буквенное обозначение</i></b><div class="codeblock"><table class="_1c"><thead><tr><td colspan="2" id="364351605"  class="head">1C</td></tr></thead><tbody><tr class="li1"><td><div id="364351605" style="height: 174px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
</pre></td><td class="de1"><pre class="de1">A<span class="sy0">=</span><span class="nu0">1</span><span class="sy0">;</span> B<span class="sy0">=</span><span class="nu0">2</span><span class="sy0">;</span> C<span class="sy0">=</span><span class="nu0">3</span><span class="sy0">;</span> 
I <span class="sy0">=</span> Новый COMОбъект<span class="br0">&#40;</span><span class="st0">&quot;BedvitCOM.BignumArithmeticInteger&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//Создаем массив целых больших чисел и арифметикой (класс)</span>
I<span class="sy0">.</span><span class="me1">BignumSet</span><span class="br0">&#40;</span>A<span class="sy0">,</span><span class="st0">&quot;12324344435654132546546546564453131&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span> &nbsp;<span class="co1">//задаем данные в число A</span>
I<span class="sy0">.</span><span class="me1">BignumSet</span><span class="br0">&#40;</span>B<span class="sy0">,</span><span class="st0">&quot;34534534546546546546554665513213211&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span> &nbsp;<span class="co1">//задаем данные в число B</span>
I<span class="sy0">.</span><span class="me1">BignumSet</span><span class="br0">&#40;</span>C<span class="sy0">,</span><span class="st0">&quot;0&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span> &nbsp;<span class="co1">//задаем данные в число С</span>
I<span class="sy0">.</span><span class="me1">Sum</span><span class="br0">&#40;</span>C<span class="sy0">,</span>A<span class="sy0">,</span>B<span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//C=A+B</span>
Сообщить<span class="br0">&#40;</span>I<span class="sy0">.</span><span class="me1">Bignum</span><span class="br0">&#40;</span>C<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//смотрим данные в числе С</span>
I<span class="sy0">.</span><span class="me1">Help</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//смотрим Help</span>
I<span class="sy0">.</span><span class="me1">Clear</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//освобождаем память для всего объекта I</span></pre></td></tr></table></div></td></tr></tbody></table></div><br />
<br />
<font color="Blue"><b>26/03/2018 - Версия 0.0.0.1 под x64.</b></font><br />
<br />
<br />
<br />
<font color="blue"><b>05/04/2018 - Новая версия BedvitCOM v.1.0.0.2 и BedvitXLL v.1.0.0.2</b></font><br />
Изменения:<br />
1. Изменен порядок аргументов в методе &quot;BignumSet&quot; (теперь, как во всех других методах, номер длинного числа в массиве - стоит первым аргументом), см.под спойлером<br />

			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   Ранее было так:<br />
I.BignumSet &quot;6546414654564&quot; , 1<br />
теперь так:<br />
I.BignumSet 1, &quot;6546414654564&quot;<br />

				   </div>
			   </div><br />
2. Добавлены новые методы в два класса (запись длинного числа в файл .txt и чтение из файла)<br />
.FileSet, .FileGet (описание в .Help и ниже)<br />
3. Собраны библиотеки COM и XLL в 32-разрядной версии (с корректным Help-ом, описанием интерфейса).<br />
<br />
<br />
<br />
<font color="blue"><b>24/04/2018 - Новая версия BedvitCOM v.1.0.0.3 и BedvitXLL v.1.0.0.3 (поддержка х32 и х64)</b></font><br />
1. Добавлены новые функции в два класса библиотеки COM - арифметика длинных чисел с обычными, т.е. теперь можно совершать арифметические действия длинных чисел с обычными.<br />
2. Добавлен механизм очистки/освобождения памяти как для одного числа, так и для класса/объекта в целом.<br />
3. Сделано новое описание для всех свойств и методов двух классов на русском языке в справке (см. под спойлером и в .HELP)<br />
4. XLL теперь удаляет данные из реестра (COM.DLL) под пользователем при закрытии надстройки.<br />
<br />
<br />
<br />
<font color="blue"><b> 29/04/2022 - Новая версия BedvitCOM v.2.0.0.0</b></font><br />
1.Класс/массив Bignum теперь может быть <b>любого размера</b>, а не как ранее 256 чисел. Увеличение размера происходит автоматом, в зависимости от последнего задаваемого индекса числа в массиве.<br />
2.В связи с этим добавлен метод <b>BignumArraySize()</b> - Возвращает количество чисел Bignum в созданном классе/массиве.<br />
3.Добавлено <b>преобразование Bignum из Float в Integer</b> (обратное преобразование было возможно и ранее). Метод <b>GetToBignumInt(LONG Bignum, LONG BignumBase=10)</b>. <font color="Red">ВАЖНО!</font> преобразование происходит с <font color="red">заданной</font> ранее <font color="red">точностью</font> в битах для Float (SizeBitsSet). Без округлений, отбрасывается дробная часть. Будьте внимательнее в таких преобразованиях.<br />
4.Исправлен баг в выделением памяти для разных экземпляров одного и того же класса. Теперь для каждого экземпляра - свой участок памяти.<br />
5.Теперь деструктор класса <b>сам очищает память</b> (при удалении класса или завершении процедуры в VBA). Методы Clear теперь нужны только там, где нужно освободить память в действующим классе. При завершении процедуры их писать не обязательно (для VB, и для языков, где класс уничтожается при завершении процедуры - запуская деструктор).</div>


<!-- attachments -->
	<div style="margin-top:10px">

		
			<fieldset class="fieldset">
				<legend>Миниатюры</legend>
				<div style="padding:3px">
				
	<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4738&amp;d=1522091689" target="attachment" rel="Lightbox" id="attachment4738"><img loading="lazy" decoding="async" class="thumbnail" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4738&amp;stc=1&amp;thumb=1&amp;d=1522091689" border="0" alt="Нажмите на изображение для увеличения
Название: BedvitXLL.PNG
Просмотров: 1637
Размер:	23.0 Кб
ID:	4738" /></a>
	&nbsp;
	

	<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4739&amp;d=1522091689" target="attachment" rel="Lightbox" id="attachment4739"><img loading="lazy" decoding="async" class="thumbnail" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4739&amp;stc=1&amp;thumb=1&amp;d=1522091689" border="0" alt="Нажмите на изображение для увеличения
Название: BedvitXLL2.PNG
Просмотров: 1369
Размер:	14.8 Кб
ID:	4739" /></a>
	&nbsp;
	

	<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4786&amp;d=1524583316" target="attachment" rel="Lightbox" id="attachment4786"><img loading="lazy" decoding="async" class="thumbnail" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4786&amp;stc=1&amp;thumb=1&amp;d=1524583316" border="0" alt="Нажмите на изображение для увеличения
Название: BedvitCOM3.PNG
Просмотров: 1558
Размер:	31.9 Кб
ID:	4786" /></a>
	&nbsp;
	
		<br /><br />
	

	<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4787&amp;d=1524583362" target="attachment" rel="Lightbox" id="attachment4787"><img loading="lazy" decoding="async" class="thumbnail" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4787&amp;stc=1&amp;thumb=1&amp;d=1524583362" border="0" alt="Нажмите на изображение для увеличения
Название: BedvitCOM5.PNG
Просмотров: 1808
Размер:	68.3 Кб
ID:	4787" /></a>
	&nbsp;
	

				</div>
			</fieldset>
		
		
			<fieldset class="fieldset">
				<legend>Изображения</legend>
				<div style="padding:3px">
				<img loading="lazy" decoding="async" class="attach" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4737&amp;stc=1&amp;d=1522091689" border="0" alt="" />&nbsp;
				</div>
			</fieldset>
		
		
		
			<fieldset class="fieldset">
				<legend>Вложения</legend>
				<table cellpadding="0" cellspacing="3" border="0">
				<tr>
	<td><img loading="lazy" decoding="async" class="inlineimg" src="http://www.cyberforum.ru//cyberstatic.net/images/attach/zip.gif" alt="Тип файла: zip" width="16" height="16" border="0" style="vertical-align:baseline" /></td>
	<td><a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4740&amp;d=1522092050">BedvitDLLv0.0.0.1.zip</a> (560.0 Кб, 599 просмотров)</td>
</tr><tr>
	<td><img loading="lazy" decoding="async" class="inlineimg" src="http://www.cyberforum.ru//cyberstatic.net/images/attach/zip.gif" alt="Тип файла: zip" width="16" height="16" border="0" style="vertical-align:baseline" /></td>
	<td><a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4745&amp;d=1522922121">BedvitDLLv1.0.0.2x32.zip</a> (474.2 Кб, 657 просмотров)</td>
</tr><tr>
	<td><img loading="lazy" decoding="async" class="inlineimg" src="http://www.cyberforum.ru//cyberstatic.net/images/attach/zip.gif" alt="Тип файла: zip" width="16" height="16" border="0" style="vertical-align:baseline" /></td>
	<td><a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4746&amp;d=1522922121">BedvitDLLv1.0.0.2x64.zip</a> (556.8 Кб, 616 просмотров)</td>
</tr><tr>
	<td><img loading="lazy" decoding="async" class="inlineimg" src="http://www.cyberforum.ru//cyberstatic.net/images/attach/zip.gif" alt="Тип файла: zip" width="16" height="16" border="0" style="vertical-align:baseline" /></td>
	<td><a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4788&amp;d=1524584147">BedvitDLLv1.0.0.3x32.zip</a> (701.8 Кб, 657 просмотров)</td>
</tr><tr>
	<td><img loading="lazy" decoding="async" class="inlineimg" src="http://www.cyberforum.ru//cyberstatic.net/images/attach/zip.gif" alt="Тип файла: zip" width="16" height="16" border="0" style="vertical-align:baseline" /></td>
	<td><a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4789&amp;d=1524584147">BedvitDLLv1.0.0.3x64.zip</a> (754.7 Кб, 702 просмотров)</td>
</tr>
				</table>
			</fieldset>
		

	</div>
<!-- / attachments -->
]]></content:encoded>
			<dc:creator>bedvit</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/829006/5196.html</guid>
		</item>
		<item>
			<title>Настройка консоли:Unicode, размер, шрифт (корректный ввод/вывод строк с кириллицей, пробелами, знаками юникода) С++</title>
			<link>https://www.cyberforum.ru/blogs/829006/5044.html</link>
			<pubDate>Thu, 07 Dec 2017 10:15:28 GMT</pubDate>
			<description>Простой способ больше не вспоминать о кодировках CP866, ANSI(рус.:CP1251) и костылях, типа...</description>
			<content:encoded><![CDATA[<div>Простой способ больше не вспоминать о кодировках CP866, ANSI(рус.:CP1251) и костылях, типа &quot;setlocale(LC_ALL, &quot;Russian&quot;)&quot; или &quot;SetConsoleCP(1251); SetConsoleOutputCP(1251);&quot;<br />
Применимо (протестировано) для Microsoft Visual Studio.<br />
В данном блоге я не буду рассматривать разные способы ввода\вывода в консоль строк с нужной кодировкой и их дальнейшего корректного использования в коде (в сети их предостаточно)<br />
Я рассмотрю и подробно распишу - один, который, по моему мнению, довольно прост, универсален и снимает все проблемы с вводом/выводом строк на разных языках, в т.ч. с пробелами.<br />
<br />
Этот способ - переход на Unicode.<br />
Если точнее, то на Unicode(UTF-16) - стандартный 2-х байтный (16-битный). Родной для Win (UTF-16LE) и других программ.<br />
<br />
Итак, если вам это подходит, прошу к дальнейшему чтению и обсуждению...<br />
<br />
Шаг.1 Создаем проект &quot;Unicode&quot; в Студии (&quot;Файл&quot;-&quot;Создать проект&quot;-&quot;С++-консольное приложение&quot;)<br />
Меняем<div class="codeblock"><table class="cpp"><thead><tr><td colspan="2" id="116066373"  class="head">C++</td></tr></thead><tbody><tr class="li1"><td><div id="116066373" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1"><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span></pre></td></tr></table></div></td></tr></tbody></table></div>на широкую версию<div class="codeblock"><table class="cpp"><thead><tr><td colspan="2" id="736160794"  class="head">C++</td></tr></thead><tbody><tr class="li1"><td><div id="736160794" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1"><span class="kw4">int</span> wmain<span class="br0">&#40;</span><span class="kw4">int</span> argc, <span class="kw4">wchar_t</span><span class="sy2">*</span> argv<span class="br0">&#91;</span><span class="br0">&#93;</span>, <span class="kw4">wchar_t</span> <span class="sy2">*</span>envp<span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></pre></td></tr></table></div></td></tr></tbody></table></div>Шаг.2 Переводим ввод\вывод в консоль на Unicode <div class="codeblock"><table class="cpp"><thead><tr><td colspan="2" id="558403350"  class="head">C++</td></tr></thead><tbody><tr class="li1"><td><div id="558403350" style="height: 78px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
</pre></td><td class="de1"><pre class="de1">&nbsp; &nbsp; _setmode<span class="br0">&#40;</span>_fileno<span class="br0">&#40;</span><span class="kw2">stdout</span><span class="br0">&#41;</span>, _O_U16TEXT<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; _setmode<span class="br0">&#40;</span>_fileno<span class="br0">&#40;</span><span class="kw2">stdin</span><span class="br0">&#41;</span>, _O_U16TEXT<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; _setmode<span class="br0">&#40;</span>_fileno<span class="br0">&#40;</span><span class="kw2">stderr</span><span class="br0">&#41;</span>, _O_U16TEXT<span class="br0">&#41;</span><span class="sy4">;</span></pre></td></tr></table></div></td></tr></tbody></table></div>Шаг.3 Переводим на Unicode, собственно сам проект: &quot;Файл&quot; - &quot;Сохранить &quot;Unicode.cpp&quot; как&quot; ... далее... на кнопке &quot;сохранить&quot;-список &quot;сохранить с кодировкой&quot; (на вопрос &quot;заменить?&quot; жмем - &quot;да&quot;) - выбираем &quot;Юникод, кодовая страница 1200&quot; - &quot;ОК&quot;<br />
или в общепринятый UTF-8 (в Студии по умолчанию кодировка для проектов &quot;UTF-8 с сигнатурой&quot;, оставляем её)<br />
<br />
Шаг.4 Добавляем возможность поменять размер окна (если вам не нужно можно эту часть пропустить) и сам шрифт (для возможности отображать Unicode-символы) - я выбрал стандартный, присутствующий у всех - Lucida Console.<br />
 Если у вас установлен нужный шрифт с поддержкой нужных вам символов, эту часть то же можно пропустить.<div class="codeblock"><table class="cpp"><thead><tr><td colspan="2" id="273545545"  class="head">C++</td></tr></thead><tbody><tr class="li1"><td><div id="273545545" style="height: 286px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="de1"><pre class="de1"><span class="co1">////////////////////меняем размер консоли - опционально - можно пропустить</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">system</span><span class="br0">&#40;</span><span class="st0">&quot;mode con cols=100 lines=50&quot;</span><span class="br0">&#41;</span><span class="sy4">;</span> <span class="co1">//размер окна, вывод нужного количества строк в консоль</span>
&nbsp; &nbsp; &nbsp; &nbsp; HANDLE &nbsp;hout <span class="sy1">=</span> GetStdHandle<span class="br0">&#40;</span>STD_OUTPUT_HANDLE<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; COORD &nbsp;size<span class="br0">&#123;</span> <span class="nu0">100</span>,<span class="nu0">100</span> <span class="br0">&#125;</span><span class="sy4">;</span><span class="co1">//символов строки, строк</span>
&nbsp; &nbsp; &nbsp; &nbsp; SetConsoleScreenBufferSize<span class="br0">&#40;</span>hout, size<span class="br0">&#41;</span><span class="sy4">;</span><span class="co1">//размер буфера</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">///////////////////////////////////Меняем шрифт для отображения символов Unicode, можно пропустить - если у вас установлен такой</span>
&nbsp; &nbsp; &nbsp; &nbsp; CONSOLE_FONT_INFOEX cfi<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; cfi.<span class="me1">cbSize</span> <span class="sy1">=</span> <span class="kw3">sizeof</span><span class="br0">&#40;</span>CONSOLE_FONT_INFOEX<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; cfi.<span class="me1">nFont</span> <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; cfi.<span class="me1">dwFontSize</span>.<span class="me1">X</span> <span class="sy1">=</span> <span class="nu0">8</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; cfi.<span class="me1">dwFontSize</span>.<span class="me1">Y</span> <span class="sy1">=</span> <span class="nu0">14</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; cfi.<span class="me1">FontFamily</span> <span class="sy1">=</span> FF_DONTCARE<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; cfi.<span class="me1">FontWeight</span> <span class="sy1">=</span> FW_NORMAL<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; wcscpy_s<span class="br0">&#40;</span>cfi.<span class="me1">FaceName</span>, <span class="co3">L</span><span class="st0">&quot;Lucida Console&quot;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; SetCurrentConsoleFontEx<span class="br0">&#40;</span>hout, <span class="kw2">false</span>, <span class="sy3">&amp;</span>cfi<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">///////////////////////////////////Меняем шрифт</span></pre></td></tr></table></div></td></tr></tbody></table></div>Шаг.5 Итоговый - добавляем сам код для тестирования - Готово! - Тестируем.<br />
Я написал тест для двух вариантов, используя &quot;std::&quot; и не используя, выбирайте нужный вам.<br />
<div class="codeblock"><table class="cpp"><thead><tr><td colspan="2" id="934142520"  class="head">C++</td></tr></thead><tbody><tr class="li1"><td><div id="934142520" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
</pre></td><td class="de1"><pre class="de1"><span class="co1">// Unicode.cpp: определяет точку входа для консольного приложения.</span>
&nbsp;
<span class="co2">#include &lt;fcntl.h&gt;</span>
<span class="co2">#include &lt;io.h&gt;</span>
<span class="co2">#include &lt;Windows.h&gt;</span>
<span class="co2">#include &lt;iostream&gt;</span>
<span class="co2">#include &lt;sstream&gt;</span>
&nbsp;
<span class="kw4">int</span> wmain<span class="br0">&#40;</span><span class="kw4">int</span> argc, <span class="kw4">wchar_t</span><span class="sy2">*</span> argv<span class="br0">&#91;</span><span class="br0">&#93;</span>, <span class="kw4">wchar_t</span> <span class="sy2">*</span>envp<span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="co1">//https://msdn.microsoft.com/ru-ru/library/bky3b5dh.aspx?f=255&amp;MSPPError=-2147217396</span>
<span class="br0">&#123;</span> &nbsp; <span class="co1">////////////////////Переводим в Юникод</span>
&nbsp; &nbsp; _setmode<span class="br0">&#40;</span>_fileno<span class="br0">&#40;</span><span class="kw2">stdout</span><span class="br0">&#41;</span>, _O_U16TEXT<span class="br0">&#41;</span><span class="sy4">;</span> <span class="co1">// https://msdn.microsoft.com/ru-ru/library/tw4k6df8.aspx</span>
&nbsp; &nbsp; _setmode<span class="br0">&#40;</span>_fileno<span class="br0">&#40;</span><span class="kw2">stdin</span><span class="br0">&#41;</span>, _O_U16TEXT<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; _setmode<span class="br0">&#40;</span>_fileno<span class="br0">&#40;</span><span class="kw2">stderr</span><span class="br0">&#41;</span>, _O_U16TEXT<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="co1">////////////////////Меняем размер консоли - можно пропустить, если вам не надо</span>
&nbsp; &nbsp; <span class="kw3">system</span><span class="br0">&#40;</span><span class="st0">&quot;mode con cols=100 lines=50&quot;</span><span class="br0">&#41;</span><span class="sy4">;</span> <span class="co1">//размер окна, вывод нужного количества строк в консоль (видимых)</span>
&nbsp; &nbsp; HANDLE &nbsp;hout <span class="sy1">=</span> GetStdHandle<span class="br0">&#40;</span>STD_OUTPUT_HANDLE<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; COORD &nbsp;size<span class="br0">&#123;</span> <span class="nu0">100</span>,<span class="nu0">100</span> <span class="br0">&#125;</span><span class="sy4">;</span><span class="co1">//символов строки, строк (если больше чем видимых, скрываются под ползунком прокрутки)</span>
&nbsp; &nbsp; SetConsoleScreenBufferSize<span class="br0">&#40;</span>hout, size<span class="br0">&#41;</span><span class="sy4">;</span><span class="co1">//размер буфера</span>
&nbsp; &nbsp; <span class="co1">////////////////////Меняем шрифт для отображения символов Unicode, можно пропустить - если у вас установлен нужный</span>
&nbsp; &nbsp; CONSOLE_FONT_INFOEX cfi<span class="sy4">;</span> <span class="co1">//https://docs.microsoft.com/en-us/windows/console/console-font-infoex</span>
&nbsp; &nbsp; cfi.<span class="me1">cbSize</span> <span class="sy1">=</span> <span class="kw3">sizeof</span><span class="br0">&#40;</span>CONSOLE_FONT_INFOEX<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; cfi.<span class="me1">nFont</span> <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span>
&nbsp; &nbsp; cfi.<span class="me1">dwFontSize</span>.<span class="me1">X</span> <span class="sy1">=</span> <span class="nu0">8</span><span class="sy4">;</span>
&nbsp; &nbsp; cfi.<span class="me1">dwFontSize</span>.<span class="me1">Y</span> <span class="sy1">=</span> <span class="nu0">14</span><span class="sy4">;</span>
&nbsp; &nbsp; cfi.<span class="me1">FontFamily</span> <span class="sy1">=</span> FF_DONTCARE<span class="sy4">;</span>
&nbsp; &nbsp; cfi.<span class="me1">FontWeight</span> <span class="sy1">=</span> FW_NORMAL<span class="sy4">;</span><span class="co1">//400;</span>
&nbsp; &nbsp; wcscpy_s<span class="br0">&#40;</span>cfi.<span class="me1">FaceName</span>, <span class="co3">L</span><span class="st0">&quot;Lucida Console&quot;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; SetCurrentConsoleFontEx<span class="br0">&#40;</span>hout, <span class="kw2">false</span>, <span class="sy3">&amp;</span>cfi<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="co1">////////////////////</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">//Тест</span>
&nbsp; &nbsp; <span class="kw4">wchar_t</span><span class="sy2">*</span> wchar_C <span class="sy1">=</span> <span class="kw3">new</span> <span class="kw4">wchar_t</span><span class="br0">&#91;</span><span class="nu0">255</span><span class="br0">&#93;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="co1">//или</span>
&nbsp; &nbsp; std<span class="sy4">::</span><span class="me2">wstring</span> wstring_cpp<span class="sy4">;</span>
&nbsp;
&nbsp; &nbsp; wprintf<span class="br0">&#40;</span><span class="co3">L</span><span class="st0">&quot;%s&quot;</span>, <span class="co3">L</span><span class="st0">&quot;Testing unicode -- English -- Русский -- Ελληνικά -- Español.<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="co1">// или</span>
&nbsp; &nbsp; std<span class="sy4">::</span><span class="me2">wcout</span> <span class="sy1">&lt;&lt;</span> <span class="co3">L</span><span class="st0">&quot;Testing unicode -- English -- Русский -- Ελληνικά -- Español.&quot;</span> <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span>
&nbsp; &nbsp; 
&nbsp; &nbsp; <span class="co1">//далее</span>
&nbsp; &nbsp; wprintf<span class="br0">&#40;</span><span class="co3">L</span><span class="st0">&quot;%s&quot;</span>, <span class="co3">L</span><span class="st0">&quot;Введите строку с пробелами (разными символами, разной раскладки)(C): <span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; fgetws<span class="br0">&#40;</span>wchar_C, <span class="nu0">255</span>, <span class="kw2">stdin</span><span class="br0">&#41;</span><span class="sy4">;</span> <span class="co1">//забираем строку с пробелами</span>
&nbsp; &nbsp; wchar_C<span class="br0">&#91;</span>wcscspn<span class="br0">&#40;</span>wchar_C, <span class="co3">L</span><span class="st0">&quot;<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span> <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span> <span class="co1">//убираем перевод строки</span>
&nbsp; &nbsp; wprintf<span class="br0">&#40;</span><span class="co3">L</span><span class="st0">&quot;%s&quot;</span>, wchar_C<span class="br0">&#41;</span><span class="sy4">;</span> <span class="co1">//выводим</span>
&nbsp; &nbsp; <span class="co1">//или</span>
&nbsp; &nbsp; std<span class="sy4">::</span><span class="me2">wcout</span> <span class="sy1">&lt;&lt;</span> <span class="co3">L</span><span class="st0">&quot;<span class="es1">\n</span>Введите строку с пробелами (разными символами, разной раскладки)(C++std::): <span class="es1">\n</span>&quot;</span><span class="sy4">;</span>
&nbsp; &nbsp; std<span class="sy4">::</span><span class="me2">getline</span><span class="br0">&#40;</span>std<span class="sy4">::</span><span class="me2">wcin</span>, wstring_cpp<span class="br0">&#41;</span><span class="sy4">;</span> <span class="co1">//забираем строку с пробелами</span>
&nbsp; &nbsp; std<span class="sy4">::</span><span class="me2">wcout</span> <span class="sy1">&lt;&lt;</span> wstring_cpp <span class="sy2">+</span> <span class="co3">L</span><span class="st0">&quot;<span class="es1">\n</span>&quot;</span><span class="sy4">;</span> <span class="co1">//выводим</span>
&nbsp;
&nbsp; &nbsp; <span class="kw3">system</span><span class="br0">&#40;</span><span class="st0">&quot;pause&quot;</span><span class="br0">&#41;</span><span class="sy4">;</span><span class="co1">//пауза для просмотра результата</span>
&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div>Использованные ресурсы:<br />

			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   <a rel="nofollow noopener noreferrer" href="https://msdn.microsoft.com/ru-ru/library/bky3b5dh.aspx?f=255&amp;MSPPError=-2147217396" target="_blank" title="https://msdn.microsoft.com/ru-ru/library/bky3b5dh.aspx?f=255&amp;MSPPError=-2147217396">https://msdn.microsoft.com/ru-... 2147217396</a><br />
<a rel="nofollow noopener noreferrer" href="https://msdn.microsoft.com/ru-ru/library/tw4k6df8.aspx" target="_blank" title="https://msdn.microsoft.com/ru-ru/library/tw4k6df8.aspx">https://msdn.microsoft.com/ru-... k6df8.aspx</a><br />
<a rel="nofollow noopener noreferrer" href="https://docs.microsoft.com/en-us/windows/console/console-font-infoex" target="_blank" title="https://docs.microsoft.com/en-us/windows/console/console-font-infoex">https://docs.microsoft.com/en-... ont-infoex</a><br />
обсуждение на stackoverflow, здесь ссылка рубится, не могу выложить
				   </div>
			   </div> <br />
<br />
<a rel="nofollow noopener noreferrer" href="https://github.com/bedvit/UnicodeConsole" target="_blank" title="https://github.com/bedvit/UnicodeConsole">Мой репозиторий на GitHub</a><br />
<br />
В итоге, см.рис.</div>


<!-- attachments -->
	<div style="margin-top:10px">

		
			<fieldset class="fieldset">
				<legend>Миниатюры</legend>
				<div style="padding:3px">
				
	<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4538&amp;d=1512641724" target="attachment" rel="Lightbox" id="attachment4538"><img loading="lazy" decoding="async" class="thumbnail" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4538&amp;stc=1&amp;thumb=1&amp;d=1512641724" border="0" alt="Нажмите на изображение для увеличения
Название: Console.PNG
Просмотров: 1339
Размер:	12.4 Кб
ID:	4538" /></a>
	&nbsp;
	

				</div>
			</fieldset>
		
		
		
		
			<fieldset class="fieldset">
				<legend>Вложения</legend>
				<table cellpadding="0" cellspacing="3" border="0">
				
				</table>
			</fieldset>
		

	</div>
<!-- / attachments -->
]]></content:encoded>
			<dc:creator>bedvit</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/829006/5044.html</guid>
		</item>
		<item>
			<title>Хранение файлов и файловый менеджер в файле(листе) Excel, Бинарное хранение данных в CustomProperty листа Excel - VBA</title>
			<link>https://www.cyberforum.ru/blogs/829006/4964.html</link>
			<pubDate>Tue, 31 Oct 2017 07:32:21 GMT</pubDate>
			<description>В продолжении темы...</description>
			<content:encoded><![CDATA[<div>В продолжении <a rel="nofollow noopener noreferrer" href="http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&amp;FID=1&amp;TID=97498&amp;TITLE_SEO=97498-khranenie-faylov-i-faylovyy-menedzher-v-fayleliste-excel&amp;MID=806070&amp;result=edit#message806070" target="_blank" title="http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&amp;FID=1&amp;TID=97498&amp;TITLE_SEO=97498-khranenie-faylov-i-faylovyy-menedzher-v-fayleliste-excel&amp;MID=806070&amp;result=edit#message806070">темы</a> и <a href="https://www.cyberforum.ru/vba/thread2113574.html#post11669415">темы</a>.<br />
Получилось просто и вполне удобно, решил сохранить в блоге. В дальнейшем возможно развитие, новые алгоритмы и новые версии.<br />
<b>Кратко: Хранение файлов и простенький файловый менеджер в файле(листе) Excel, Бинарное хранение данных в CustomProperty листа (Open FileName As Binary и Get, Put через байт-массив). Запуск с параметрами хранимых файлов. </b><br />
<br />
<b>Максимальная простота и переносимость </b>- нет форм, модулей уровня проекта, классов и т.д., все в модуле листа &quot;ByteSheet(Storage)&quot;.  Переносим лист (переносятся и загруженные данные) в другой файл, готово! Или копируем код (загруженные данные НЕ переносятся) с листа &quot;ByteSheet(Storage)&quot; на свой лист - и ваш лист становится файловым менеджером!<br />
<br />
<b>Работа с файлами:</b><br />
---&gt; <b>Как через МЕНЮ</b> - работает стандартно через менеджер макросов (пользовательское стартовое меню &quot;ByteSheet.START_MENU&quot;, в котором можно выбрать нужное действие и открыть нужное меню)<br />
<br />
---&gt; <b>Так и используя ФУНКЦИИ</b> напрямую в вашем проекте/надстройке, обычном файле Excel, поддерживающим макросы. Функции возвращают количество загруженных, выгруженных, удаленных файлов в случае успеха.<br />
<br />
1.&quot;<b>DownloadF</b>&quot; - Загрузка любых файлов (в т.ч. архивов, которые можно распаковать автоматом при выгрузке - ZIP), поддерживается пакетная загрузка.<br />
<br />
2.&quot;<b>UnloadF</b>&quot; - Выгрузка(в т.ч. пакетная)/Запуск файлов с параметрами. Поддерживается следующий функционал/параметры:<br />
    2.1 Выгрузка в выбранную папку, &quot;по умолчанию&quot; выгружаются в пользовательский &quot;TEMP&quot;.<br />
    2.2 Выбор файла(ов) для выгрузки/запуска, &quot;по умолчанию&quot; выгружаются/запускаются все файлы.<br />
    2.3 Обновление файл(ов) в папке при распаковки, если он(и) там уже есть (выгружен(ы) ранее или есть с совпадающим <br />
          именем), по умолчанию: не обновляем<br />
    2.4 Распаковка из архива ZIP, по умолчанию: выгружаем архив, без распаковки<br />
    2.5 Открыть файл в Excel после распаковки, по умолчанию: не открываем<br />
    2.6 Запуск файл после распаковки, приложением &quot;по умолчанию&quot; (для архива - один файл в один архив, в обратном <br />
          случае, загрузится первый попавшийся из распакованного архива), по умолчанию: не запускаем<br />
    2.7 Запуск файла с нужными параметрами. Используется вместе с параметром 2.6 (аналогично командной строке с <br />
          параметрами, без указания самого файла - полный путь к файлу автоматом подставляется), по умолчанию: без <br />
          параметров.<br />
    2.8 Запуск файла, даже если он открыт в каком-либо процессе (запускать еще раз), по умолчанию: не запускаем.<br />
<br />
    Все эти параметры Optional, если их нет - функция выполняется с параметрами по умолчанию.<br />
<br />
3.&quot;<b>DeleteF</b>&quot; - Удаление файлов, в т.ч. пакетное.<br />
<br />
Ниже исходники (лист ByteSheet(Storage)) и пример использования - модуль &quot;Test&quot; (расчет числа Пи). <br />
В загруженных файлах секретных данных и вирусов нет.<br />
<br />
<b>Результаты стресс-тестирования:</b><br />
Загрузить (файлов - 432 шт), Выгрузить (файлов - 432 шт), Удалить (файлов - 432 шт)<br />
Общий размер файлов - 1 334 МБ (1,33 ГБ)<br />
Время выполнения всех трех операций в сумме - 25 сек.<br />
Размер книги Excel с файлами - 1,2 ГБ в формате .xlsb <br />
<br />
P.S.<br />
Отдельная благодарность! <a rel="nofollow noopener noreferrer" href="http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=profile_view&amp;UID=55" target="_blank" title="http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=profile_view&amp;UID=55">Андрей VG</a>, за любезно предоставленные алгоритмы, которые были несколько доработаны и дополнены для этих целей.<br />
<br />
<br />
<b><i><u>21/11/2017 Обновление версии: Loader_02</u></i></b><br />
1. Процедуры переписаны в функции, которые возвращают при успешном выполнении, количество загруженных, удаленных, выгруженных файлов.<br />
2. Добавлена пакетная загрузка файлов (выгрузка и удаление всех файлов уже было в первой версии) с корректным счетчиком (скриншот прилагаю).<br />
3. Добавлено описание к коду и аргументам функций.<br />
4. Добавлен запуск файлов как &quot;приложением по умолчанию&quot; так и через Excel.<br />
5. Добавлен обработчик ошибок, с выводом сообщений об ошибке.<br />
6. Добавлен запрос/вопрос пользователю на перезапись выгружаемых и загружаемых файлов, если они уже есть.<br />
<br />
<b><i><u>22/03/2018 Обновление версии: Loader_03</u></i></b><br />
1. Добавил стартовое меню (скриншот прилагаю).<br />
2. Добавил поддержку командной строки (на примере расчета числа Пи - программа упакована моя, вирусов нет.).<br />
3. Изменил порядок параметров для функций на более логичный.<br />
<br />
<b><i><u>22/04/2018 Обновление версии: Loader_04</u></i></b><br />
1. Добавил команду &quot;ОТКРЫТЬ&quot; в стартовом меню с поддержкой командной строки (скриншот прилагаю). Zip-файлы, при этом, сначала распаковываются, потом запускается первый файл в распакованной папке (поэтому рекомендуется хранить по одному файлу в архивах).<br />
2. Изменил переход по листам с символов &quot;&lt;&quot;, &quot;&gt;&quot; на &quot;-&quot;,&quot;+&quot;  - удобно использовать цифровой блок клавиатуры.<br />
3. Добавил возврат в меню при неверно введенных данных.<br />
<br />
<b><i><u>07/06/2018 Обновление версии: Loader_05</u></i></b><br />
1. Добавил проверку при запуске файла, открыт ли он в другом процессе с возможностью открыть повторно или не открывать (по умолчанию)<br />
2. Исправил ошибку, возникающих в случаях когда имя выгружаемого файла совпадало с папкой и папку нужно было удалять.<br />
3. Исправил ошибку, возникающих в случаях когда распаковывается один и тот же архив с обновлением данных (удалением старых) в целевой папке.<br />
4. Исправлена ошибка возникающая при загрузке файлов размером в нечётное количество байтов.<br />
5. Добавлена возможность указать при загрузке папку (добавил новый параметр в функцию загрузки), без указания файлов, тогда загружаются все файлы из папки.<br />
<br />
<b><i><u>30/05/2022 Обновление версии: Loader_06</u></i></b><br />
1.Исправлениа ошибка выбора папки в функции DownloadF (ранее выбиралась как папка по умолчанию, в исправленной версии выбирается указанная папка явно)<br />
2.Закомментировал в примере распаковку из .zip-файла и запуск .exe (иногда вызывает рефлексию антивируса, хотя вредоносного функционала там нет)</div>


<!-- attachments -->
	<div style="margin-top:10px">

		
			<fieldset class="fieldset">
				<legend>Миниатюры</legend>
				<div style="padding:3px">
				
	<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4782&amp;d=1524478203" target="attachment" rel="Lightbox" id="attachment4782"><img loading="lazy" decoding="async" class="thumbnail" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4782&amp;stc=1&amp;thumb=1&amp;d=1524478203" border="0" alt="Нажмите на изображение для увеличения
Название: START_MENU.png
Просмотров: 1471
Размер:	70.9 Кб
ID:	4782" /></a>
	&nbsp;
	

	<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4783&amp;d=1524478203" target="attachment" rel="Lightbox" id="attachment4783"><img loading="lazy" decoding="async" class="thumbnail" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4783&amp;stc=1&amp;thumb=1&amp;d=1524478203" border="0" alt="Нажмите на изображение для увеличения
Название: Загрузить_пакет.PNG
Просмотров: 1058
Размер:	88.1 Кб
ID:	4783" /></a>
	&nbsp;
	

	<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4791&amp;d=1524644448" target="attachment" rel="Lightbox" id="attachment4791"><img loading="lazy" decoding="async" class="thumbnail" src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4791&amp;stc=1&amp;thumb=1&amp;d=1524644448" border="0" alt="Нажмите на изображение для увеличения
Название: Выполнить2.PNG
Просмотров: 1221
Размер:	102.0 Кб
ID:	4791" /></a>
	&nbsp;
	
		<br /><br />
	

				</div>
			</fieldset>
		
		
		
		
			<fieldset class="fieldset">
				<legend>Вложения</legend>
				<table cellpadding="0" cellspacing="3" border="0">
				<tr>
	<td><img loading="lazy" decoding="async" class="inlineimg" src="http://www.cyberforum.ru//cyberstatic.net/images/attach/zip.gif" alt="Тип файла: zip" width="16" height="16" border="0" style="vertical-align:baseline" /></td>
	<td><a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=7568&amp;d=1653938365">Loader_06.zip</a> (272.8 Кб, 502 просмотров)</td>
</tr>
				</table>
			</fieldset>
		

	</div>
<!-- / attachments -->
]]></content:encoded>
			<dc:creator>bedvit</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/829006/4964.html</guid>
		</item>
		<item>
			<title>Быстрый алгоритмы поиска простых/всех делителей натурального числа (в т.ч. факторизация натурального числа)С++</title>
			<link>https://www.cyberforum.ru/blogs/829006/4754.html</link>
			<pubDate>Thu, 18 May 2017 15:12:01 GMT</pubDate>
			<description>Столкнувшись с данной тематикой, ранее как-то спокойно проходящей мимо меня, решил немного...</description>
			<content:encoded><![CDATA[<div>Столкнувшись с данной тематикой, ранее как-то спокойно проходящей мимо меня, решил немного посвятить время и разобраться на уровне обычного человека (!= Перельман Г.Я.)<br />
Итак не открою тайны, что достаточно большие числа долго раскладываются на простые большие множители, на чем основывается, к примеру алгоритм RSA.(Вопрос о существовании алгоритма факторизации с полиномиальной сложностью на классическом компьютере является одной из важных открытых проблем современной теории чисел)<br />
Поэтому в данной теме хочу разобрать максимально быстрый алгоритм поиска простых делителей числа, который можно реализовать не профессионалом по математике/программированию, без распределенный вычислений, на обычном ПК.<br />
<br />
Итак какие оптимизации сделаны (по порядку внесения в проект):<br />
1.Начиналось все с алгоритма поиска всех делителей - обычным перебором долго, хотя современный ПК позволяет это делать до пределов размера числа 2^64.<br />
2.Ввести верхнюю границу перебора как <b>корень из N</b> (задаваемого числа, для которого ищем делители) - логично, если мы ищем делители.<br />
3.Отказаться от прямого перебора и делить уже <b>остаток от деления </b>N на предыдущий найденный простой делитель, тем самым уменьшая количество итераций и пересчитывая верхнюю границу как корень из N.<br />
4.Расспаралелить процесс расчета (в данном проекте получилось на <b>8/9 потоков</b>)<br />
5.На самом деле перебирать нужно не все числа, а нужен лишь цикл по <b>простым числам</b>.<br />
Была мысль использовать  решето Эратосфена или Решето Аткина.<br />
В итоге реализована оптимизация <a rel="nofollow noopener noreferrer" href="https://en.wikipedia.org/wiki/Wheel_factorization" target="_blank" title="https://en.wikipedia.org/wiki/Wheel_factorization"><b>wheel factorization</b></a>, если кратко - все простые числа, кроме 2, 3 и 5, лежат в одной из восьми следующих арифметических прогрессий: 30k+1, 30k+7, 30k+11, 30k+13, 30k+17, 30k+19, 30k+23 и 30k+29.<br />
Для каждого потока своя прогрессия.<br />
6.Максимальный размер числа на данном этапе == машинному слову, т.е. 2^64-1<br />
Подключаем библиотеку<b> MPIR </b>is licensed LGPL v3+.<br />
Как подключить (<a rel="nofollow noopener noreferrer" href="http://edu.mmcs.sfedu.ru/mod/page/view.php?id=12469" target="_blank" title="http://edu.mmcs.sfedu.ru/mod/page/view.php?id=12469">Инструкции по использованию библиотек GMP и MPIR в системе Windows</a>)<br />
7.Внедряем библиотеку в свой проект - размер задаваемого числа теперь зависит только от производительности ПК.<br />
8.Оптимизируем весь проект:<br />
8.1.Проверка N на простое число - MPIR<br />
8.2.Проверка на размер числа (до 2^64-1) - расчет на родном unsigned long long, далее через mpz_class библиотеки MPIR.<br />
8.3.Факторизация числа (разложение на простые делители)<br />
Элементарно решается данным кодом поменяв строку 1 на строку 2 в коде:
			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   <div class="codeblock"><table class="cpp"><thead><tr><td colspan="2" id="165641052"  class="head">C++</td></tr></thead><tbody><tr class="li1"><td><div id="165641052" style="height: 62px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
</pre></td><td class="de1"><pre class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>oldMn <span class="sy3">!</span><span class="sy1">=</span> Mn<span class="br0">&#41;</span> std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> Mn <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span><span class="co1">//меняем на</span>
std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> Mn <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span></pre></td></tr></table></div></td></tr></tbody></table></div>
				   </div>
			   </div><br />
В проекте морф алгоритма на поиск всех делителей (не только простых).<br />
<br />
Сборка х64<br />
Код и .exe:<br />
1. На unsigned long long:<br />

			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   <div class="codeblock"><table class="cpp"><thead><tr><td colspan="2" id="262443268"  class="head">C++</td></tr></thead><tbody><tr class="li1"><td><div id="262443268" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
</pre></td><td class="de1"><pre class="de1"><span class="co2">#include &lt;mpirxx.h&gt;</span>
<span class="co2">#include &lt;iostream&gt;</span>
<span class="co2">#include &lt;time.h&gt;</span>
<span class="co2">#include &lt;vector&gt;</span>
<span class="co2">#include &lt;thread&gt;</span>
&nbsp;
<span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span> Ostatok<span class="sy4">;</span>
<span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span> Ostatok2<span class="sy4">;</span>
&nbsp;
<span class="kw4">void</span> Func<span class="br0">&#40;</span><span class="kw4">int</span> start<span class="br0">&#41;</span>
<span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span> Ch <span class="sy1">=</span> <span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span> Mn <span class="sy1">=</span> <span class="nu0">30</span> <span class="sy2">*</span> Ch <span class="sy2">+</span> start<span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span> oldMn<span class="sy4">;</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>Mn <span class="sy1">&lt;=</span> Ostatok2<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>Ostatok<span class="sy2">%</span>Mn <span class="sy1">==</span> <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Ostatok <span class="sy1">=</span> Ostatok <span class="sy2">/</span> Mn<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>oldMn <span class="sy3">!</span><span class="sy1">=</span> Mn<span class="br0">&#41;</span> std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> Mn <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Ostatok2 <span class="sy1">=</span> <span class="br0">&#40;</span><span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span><span class="br0">&#41;</span><span class="kw3">sqrt</span><span class="br0">&#40;</span>Ostatok<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; oldMn <span class="sy1">=</span> Mn<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Ch<span class="sy2">++</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Mn <span class="sy1">=</span> <span class="nu0">30</span> <span class="sy2">*</span> Ch <span class="sy2">+</span> start<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
&nbsp; &nbsp; std<span class="sy4">::</span><span class="me2">string</span> s<span class="sy4">;</span>
&nbsp; &nbsp; std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;Enter the numeric for which you want to find Simple dividers, followed by &lt;Enter&gt;:<span class="es1">\n</span>&quot;</span><span class="sy4">;</span>
&nbsp; &nbsp; std<span class="sy4">::</span><span class="kw3">cin</span> <span class="sy1">&gt;&gt;</span> Ostatok<span class="sy4">;</span><span class="co1">//s;</span>
&nbsp; &nbsp; std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;Result:<span class="es1">\n</span>1&quot;</span> <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw4">unsigned</span> <span class="kw4">int</span> start_time <span class="sy1">=</span> <span class="kw3">clock</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span> <span class="co1">// начальное время</span>
&nbsp; &nbsp; Ostatok2 <span class="sy1">=</span> <span class="br0">&#40;</span><span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span><span class="br0">&#41;</span><span class="kw3">sqrt</span><span class="br0">&#40;</span>Ostatok<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span> Mn <span class="sy1">=</span> <span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span> oldMn<span class="sy4">;</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>Mn <span class="sy1">&lt;=</span> <span class="nu0">30</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>Ostatok<span class="sy2">%</span>Mn <span class="sy1">==</span> <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Ostatok <span class="sy1">=</span> Ostatok <span class="sy2">/</span> Mn<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>oldMn <span class="sy3">!</span><span class="sy1">=</span> Mn<span class="br0">&#41;</span> std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> Mn <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Ostatok2 <span class="sy1">=</span> <span class="br0">&#40;</span><span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span><span class="br0">&#41;</span><span class="kw3">sqrt</span><span class="br0">&#40;</span>Ostatok<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; oldMn <span class="sy1">=</span> Mn<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span> Mn<span class="sy2">++</span><span class="sy4">;</span> <span class="br0">&#125;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; std<span class="sy4">::</span><span class="me2">vector</span><span class="sy1">&lt;</span>std<span class="sy4">::</span><span class="me2">thread</span><span class="sy1">&gt;</span> thr<span class="br0">&#40;</span><span class="nu0">8</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw4">int</span> arr<span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy1">=</span> <span class="br0">&#123;</span> <span class="nu0">0</span>,<span class="nu0">1</span>,<span class="nu0">7</span>,<span class="nu0">11</span>, <span class="nu0">13</span>, <span class="nu0">17</span>, <span class="nu0">19</span>, <span class="nu0">23</span>, <span class="nu0">29</span> <span class="br0">&#125;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span> i <span class="sy1">&lt;=</span> <span class="nu0">8</span><span class="sy4">;</span> i<span class="sy2">++</span><span class="br0">&#41;</span> thr<span class="br0">&#91;</span>i <span class="sy2">-</span> <span class="nu0">1</span><span class="br0">&#93;</span> <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">thread</span><span class="br0">&#40;</span>Func, arr<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span> i <span class="sy1">&lt;=</span> <span class="nu0">8</span><span class="sy4">;</span> i<span class="sy2">++</span><span class="br0">&#41;</span> thr<span class="br0">&#91;</span>i <span class="sy2">-</span> <span class="nu0">1</span><span class="br0">&#93;</span>.<span class="me1">join</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>Ostatok <span class="sy1">&gt;</span> <span class="nu0">1</span><span class="br0">&#41;</span> std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> Ostatok <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw4">unsigned</span> <span class="kw4">int</span> end_time <span class="sy1">=</span> <span class="kw3">clock</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span> <span class="co1">// конечное время</span>
&nbsp; &nbsp; <span class="kw4">unsigned</span> <span class="kw4">int</span> search_time <span class="sy1">=</span> end_time <span class="sy2">-</span> start_time<span class="sy4">;</span> <span class="co1">// искомое время</span>
&nbsp; &nbsp; <span class="kw3">printf</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es1">\n</span>Time, sec (min): %f (%f) <span class="es1">\n</span>&quot;</span>, search_time <span class="sy2">/</span> <span class="nu16">1000.0</span>, search_time <span class="sy2">/</span> <span class="nu16">60000.0</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw3">system</span><span class="br0">&#40;</span><span class="st0">&quot;pause&quot;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div>
				   </div>
			   </div><br />
Через mpz_class библиотек MPIR:<br />

			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   <div class="codeblock"><table class="cpp"><thead><tr><td colspan="2" id="254287860"  class="head">C++</td></tr></thead><tbody><tr class="li1"><td><div id="254287860" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
</pre></td><td class="de1"><pre class="de1"><span class="co2">#include &lt;mpirxx.h&gt;</span>
<span class="co2">#include &lt;iostream&gt;</span>
<span class="co2">#include &lt;time.h&gt;</span>
<span class="co2">#include &lt;vector&gt;</span>
<span class="co2">#include &lt;thread&gt;</span>
&nbsp;
<span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span> Ostatok<span class="sy4">;</span>
<span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span> Ostatok2<span class="sy4">;</span>
mpz_class mpz_Ostatok<span class="sy4">;</span>
mpz_class mpz_Ostatok2<span class="sy4">;</span>
&nbsp;
<span class="kw4">void</span> Func<span class="br0">&#40;</span><span class="kw4">int</span> start<span class="br0">&#41;</span>
<span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span> Ch<span class="sy1">=</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span> Mn <span class="sy1">=</span> <span class="nu0">30</span> <span class="sy2">*</span> Ch <span class="sy2">+</span> start<span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span> oldMn<span class="sy4">;</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>Mn <span class="sy1">&lt;=</span> Ostatok2<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>Ostatok<span class="sy2">%</span>Mn <span class="sy1">==</span> <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Ostatok <span class="sy1">=</span> Ostatok <span class="sy2">/</span> Mn<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>oldMn <span class="sy3">!</span><span class="sy1">=</span> Mn<span class="br0">&#41;</span> std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> Mn <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Ostatok2 <span class="sy1">=</span> <span class="br0">&#40;</span><span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span><span class="br0">&#41;</span><span class="kw3">sqrt</span><span class="br0">&#40;</span>Ostatok<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; oldMn <span class="sy1">=</span> Mn<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span><span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Ch<span class="sy2">++</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Mn <span class="sy1">=</span> <span class="nu0">30</span> <span class="sy2">*</span> Ch <span class="sy2">+</span> start<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
<span class="br0">&#125;</span>
<span class="kw4">void</span> Func2<span class="br0">&#40;</span><span class="kw4">int</span> start<span class="br0">&#41;</span>
<span class="br0">&#123;</span>
&nbsp; &nbsp; mpz_class Ch <span class="sy1">=</span> <span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; mpz_class Mn <span class="sy1">=</span> <span class="nu0">30</span> <span class="sy2">*</span> Ch <span class="sy2">+</span> start<span class="sy4">;</span>
&nbsp; &nbsp; mpz_class oldMn<span class="sy4">;</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>Mn <span class="sy1">&lt;=</span> mpz_Ostatok2<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>mpz_Ostatok<span class="sy2">%</span>Mn <span class="sy1">==</span> <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mpz_Ostatok <span class="sy1">=</span> mpz_Ostatok <span class="sy2">/</span> Mn<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>oldMn <span class="sy3">!</span><span class="sy1">=</span> Mn<span class="br0">&#41;</span> std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> Mn <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mpz_Ostatok2 <span class="sy1">=</span> <span class="kw3">sqrt</span><span class="br0">&#40;</span>mpz_Ostatok<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; oldMn <span class="sy1">=</span> Mn<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Ch<span class="sy2">++</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Mn <span class="sy1">=</span> <span class="nu0">30</span> <span class="sy2">*</span> Ch <span class="sy2">+</span> start<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
<span class="br0">&#125;</span>
<span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="kw4">bool</span> mpz_Start<span class="sy4">;</span>
&nbsp; &nbsp; mpz_class oldMn<span class="sy4">;</span>
&nbsp; &nbsp; std<span class="sy4">::</span><span class="me2">string</span> s<span class="sy4">;</span>
&nbsp; &nbsp; std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;Enter the numeric for which you want to find Simple dividers, followed by &lt;Enter&gt;:<span class="es1">\n</span>&quot;</span><span class="sy4">;</span>
&nbsp; &nbsp; std<span class="sy4">::</span><span class="kw3">cin</span> <span class="sy1">&gt;&gt;</span> s<span class="sy4">;</span><span class="co1">//Ostatok;//s;</span>
&nbsp; &nbsp; std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;Result:<span class="es1">\n</span>1&quot;</span> <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw4">unsigned</span> <span class="kw4">int</span> start_time <span class="sy1">=</span> <span class="kw3">clock</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span> <span class="co1">// начальное время</span>
&nbsp; &nbsp; mpz_Ostatok <span class="sy1">=</span> s<span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>mpz_probab_prime_p<span class="br0">&#40;</span>mpz_Ostatok.<span class="me1">get_mpz_t</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="nu0">100</span><span class="br0">&#41;</span> <span class="sy1">==</span> <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; std<span class="sy4">::</span><span class="me2">vector</span><span class="sy1">&lt;</span>std<span class="sy4">::</span><span class="me2">thread</span><span class="sy1">&gt;</span> thr<span class="br0">&#40;</span><span class="nu0">8</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> arr<span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy1">=</span> <span class="br0">&#123;</span> <span class="nu0">0</span>,<span class="nu0">1</span>,<span class="nu0">7</span>,<span class="nu0">11</span>, <span class="nu0">13</span>, <span class="nu0">17</span>, <span class="nu0">19</span>, <span class="nu0">23</span>, <span class="nu0">29</span> <span class="br0">&#125;</span><span class="sy4">;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>mpz_Ostatok <span class="sy1">&gt;</span> <span class="nu0">18446744073709551615</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mpz_Ostatok2 <span class="sy1">=</span> <span class="kw3">sqrt</span><span class="br0">&#40;</span>mpz_Ostatok<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mpz_class Mn <span class="sy1">=</span> <span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mpz_class oldMn<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>Mn <span class="sy1">&lt;=</span> <span class="nu0">30</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>mpz_Ostatok<span class="sy2">%</span>Mn <span class="sy1">==</span> <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mpz_Ostatok <span class="sy1">=</span> mpz_Ostatok <span class="sy2">/</span> Mn<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>oldMn <span class="sy3">!</span><span class="sy1">=</span> Mn<span class="br0">&#41;</span> std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> Mn <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mpz_Ostatok2 <span class="sy1">=</span><span class="kw3">sqrt</span><span class="br0">&#40;</span>mpz_Ostatok<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; oldMn <span class="sy1">=</span> Mn<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span> Mn<span class="sy2">++</span><span class="sy4">;</span> <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span> i <span class="sy1">&lt;=</span> <span class="nu0">8</span><span class="sy4">;</span> i<span class="sy2">++</span><span class="br0">&#41;</span> thr<span class="br0">&#91;</span>i <span class="sy2">-</span> <span class="nu0">1</span><span class="br0">&#93;</span> <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">thread</span><span class="br0">&#40;</span>Func2, arr<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span> i <span class="sy1">&lt;=</span> <span class="nu0">8</span><span class="sy4">;</span> i<span class="sy2">++</span><span class="br0">&#41;</span> thr<span class="br0">&#91;</span>i <span class="sy2">-</span> <span class="nu0">1</span><span class="br0">&#93;</span>.<span class="me1">join</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>mpz_Ostatok <span class="sy1">&gt;</span> <span class="nu0">1</span><span class="br0">&#41;</span> std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> mpz_Ostatok <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Ostatok <span class="sy1">=</span> mpz_Ostatok.<span class="me1">get_ui</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Ostatok2 <span class="sy1">=</span> <span class="br0">&#40;</span><span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span><span class="br0">&#41;</span><span class="kw3">sqrt</span><span class="br0">&#40;</span>Ostatok<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span> Mn <span class="sy1">=</span> <span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span> oldMn<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>Mn <span class="sy1">&lt;=</span> <span class="nu0">30</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>Ostatok<span class="sy2">%</span>Mn <span class="sy1">==</span> <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Ostatok <span class="sy1">=</span> Ostatok <span class="sy2">/</span> Mn<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>oldMn <span class="sy3">!</span><span class="sy1">=</span> Mn<span class="br0">&#41;</span> std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> Mn <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Ostatok2 <span class="sy1">=</span> <span class="br0">&#40;</span><span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span><span class="br0">&#41;</span><span class="kw3">sqrt</span><span class="br0">&#40;</span>Ostatok<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; oldMn <span class="sy1">=</span> Mn<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span> Mn<span class="sy2">++</span><span class="sy4">;</span> <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span> i <span class="sy1">&lt;=</span> <span class="nu0">8</span><span class="sy4">;</span> i<span class="sy2">++</span><span class="br0">&#41;</span> thr<span class="br0">&#91;</span>i <span class="sy2">-</span> <span class="nu0">1</span><span class="br0">&#93;</span> <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">thread</span><span class="br0">&#40;</span>Func, arr<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span> i <span class="sy1">&lt;=</span> <span class="nu0">8</span><span class="sy4">;</span> i<span class="sy2">++</span><span class="br0">&#41;</span> thr<span class="br0">&#91;</span>i <span class="sy2">-</span> <span class="nu0">1</span><span class="br0">&#93;</span>.<span class="me1">join</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>Ostatok <span class="sy1">&gt;</span> <span class="nu0">1</span><span class="br0">&#41;</span> std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> Ostatok <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span> std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> s <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span> <span class="br0">&#125;</span>
&nbsp; &nbsp; <span class="kw4">unsigned</span> <span class="kw4">int</span> end_time <span class="sy1">=</span> <span class="kw3">clock</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span> <span class="co1">// конечное время</span>
&nbsp; &nbsp; <span class="kw4">unsigned</span> <span class="kw4">int</span> search_time <span class="sy1">=</span> end_time <span class="sy2">-</span> start_time<span class="sy4">;</span> <span class="co1">// искомое время</span>
&nbsp; &nbsp; <span class="kw3">printf</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es1">\n</span>Time, sec (min): %f (%f) <span class="es1">\n</span>&quot;</span>, search_time <span class="sy2">/</span> <span class="nu16">1000.0</span>, search_time <span class="sy2">/</span> <span class="nu16">60000.0</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw3">system</span><span class="br0">&#40;</span><span class="st0">&quot;pause&quot;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div>
				   </div>
			   </div><br />
<br />
<b>23/05/2017 Продолжение...</b><br />
<br />
9.Итак добавив мультипоточное вычисление с общими глобальными переменными, нужно позаботится о синхронизации потоков и  потокобезопасности этих переменных. Есть разные инструменты - Критические секции, Взаимоисключения(Объекты-взаимоисключения (мьютексы, mutex - от MUTual EXclusion)), События, Семафоры, использование атомарных переменных С++ и функций и т.д.<br />
Я остановился на Критических секциях.<br />
10.Далее добавляем алгоритмы расчёта всех делителей числа, факторизации числа (немного модефицировав текущий алгоритм).<br />
11.Добавляем код на увеличение размера консоли (10 000 строк - что бы влезали все делители для больших чисел), добавляем счетчик решений, и продукт готов.<br />
<br />
<b><i>ФУНКЦИОНАЛ:<br />
1.Факторизация числа<br />
2.Поиск простых делителей числа<br />
3.Поиск всех делителей числа</i></b><br />
<br />
Размер задаваемого числа ограничен лишь производительностью Вашего/моего ПК (к примеру для числа 25-35 десятичных от долей секунды и выше - сильно зависит от количества мелких простых делителей, общего количества простых делителей и других особенностей данного алгоритма разложения числа).<br />
<br />
КОД Relese x64<br />

			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   <div class="codeblock"><table class="cpp"><thead><tr><td colspan="2" id="894819251"  class="head">C++</td></tr></thead><tbody><tr class="li1"><td><div id="894819251" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
</pre></td><td class="de1"><pre class="de1"><span class="co1">// Делители числа</span>
<span class="co1">//Created by ©2017, bedvit (bedvit@mail.ru)</span>
<span class="co2">#include &lt;mpirxx.h&gt;</span>
<span class="co2">#include &lt;iostream&gt;</span>
<span class="co2">#include &lt;time.h&gt;</span>
<span class="co2">#include &lt;vector&gt;</span>
<span class="co2">#include &lt;thread&gt;</span>
<span class="co2">#include &lt;Windows.h&gt;</span>
&nbsp;
CRITICAL_SECTION cs<span class="sy4">;</span><span class="co1">//критическая секция</span>
<span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span> Ostatok<span class="sy4">;</span>
<span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span> Ostatok2<span class="sy4">;</span>
<span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span> oldMn<span class="sy4">;</span>
<span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span> ArrRez<span class="br0">&#91;</span><span class="nu0">3000</span><span class="br0">&#93;</span> <span class="sy1">=</span> <span class="br0">&#123;</span><span class="nu0">0</span>,<span class="nu0">1</span><span class="br0">&#125;</span><span class="sy4">;</span>
<span class="kw4">int</span> option<span class="sy4">;</span>
<span class="kw4">int</span> Solutions<span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="sy4">;</span>
<span class="kw4">int</span> y<span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="sy4">;</span>
<span class="kw4">int</span> y2<span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="sy4">;</span>
mpz_class mpz_Ostatok<span class="sy4">;</span>
mpz_class mpz_Ostatok2<span class="sy4">;</span>
mpz_class mpz_oldMn<span class="sy4">;</span>
mpz_class mpz_ArrRez<span class="br0">&#91;</span><span class="nu0">100000</span><span class="br0">&#93;</span> <span class="sy1">=</span> <span class="br0">&#123;</span> <span class="nu0">0</span>,<span class="nu0">1</span> <span class="br0">&#125;</span><span class="sy4">;</span>
&nbsp;
<span class="kw4">void</span> Func<span class="br0">&#40;</span><span class="kw4">int</span> start<span class="br0">&#41;</span>
<span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span> Ch<span class="sy1">=</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span> Mn <span class="sy1">=</span> <span class="nu0">30</span> <span class="sy2">*</span> Ch <span class="sy2">+</span> start<span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>Mn <span class="sy1">&lt;=</span> Ostatok2<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>Ostatok<span class="sy2">%</span>Mn <span class="sy1">==</span> <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; EnterCriticalSection<span class="br0">&#40;</span><span class="sy3">&amp;</span>cs<span class="br0">&#41;</span><span class="sy4">;</span><span class="co1">//критическая секция</span>
&nbsp; &nbsp; &nbsp; &nbsp; Ostatok <span class="sy1">=</span> Ostatok <span class="sy2">/</span> Mn<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; Ostatok2 <span class="sy1">=</span> <span class="br0">&#40;</span><span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span><span class="br0">&#41;</span><span class="kw3">sqrt</span><span class="br0">&#40;</span>Ostatok<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>option <span class="sy1">==</span> <span class="nu0">3</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>oldMn <span class="sy3">!</span><span class="sy1">=</span> Mn<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>y <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span> y <span class="sy1">&lt;=</span> Solutions<span class="sy4">;</span> y<span class="sy2">++</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ArrRez<span class="br0">&#91;</span>Solutions <span class="sy2">+</span> y<span class="br0">&#93;</span> <span class="sy1">=</span> ArrRez<span class="br0">&#91;</span>y<span class="br0">&#93;</span> <span class="sy2">*</span> Mn<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> ArrRez<span class="br0">&#91;</span>Solutions <span class="sy2">+</span> y<span class="br0">&#93;</span> <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Solutions <span class="sy1">=</span> Solutions <span class="sy2">+</span> y <span class="sy2">-</span> <span class="nu0">1</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>y2 <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span> y2 <span class="sy1">&lt;</span> y<span class="sy4">;</span> y2<span class="sy2">++</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ArrRez<span class="br0">&#91;</span>Solutions <span class="sy2">+</span> y2<span class="br0">&#93;</span> <span class="sy1">=</span> ArrRez<span class="br0">&#91;</span>Solutions <span class="sy2">-</span> y <span class="sy2">+</span> <span class="nu0">1</span> <span class="sy2">+</span> y2<span class="br0">&#93;</span> <span class="sy2">*</span> Mn<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> ArrRez<span class="br0">&#91;</span>Solutions <span class="sy2">+</span> y2<span class="br0">&#93;</span> <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Solutions <span class="sy1">=</span> Solutions <span class="sy2">+</span> y2 <span class="sy2">-</span> <span class="nu0">1</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span>oldMn <span class="sy3">!</span><span class="sy1">=</span> Mn <span class="sy3">||</span> option <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">2</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> Solutions<span class="sy2">++</span><span class="sy4">;</span> std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> Mn <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span> <span class="br0">&#125;</span> <span class="co1">//или</span>
&nbsp; &nbsp; &nbsp; &nbsp; oldMn <span class="sy1">=</span> Mn<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; LeaveCriticalSection<span class="br0">&#40;</span><span class="sy3">&amp;</span>cs<span class="br0">&#41;</span><span class="sy4">;</span><span class="co1">//критическая секция</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span><span class="br0">&#123;</span>Ch<span class="sy2">++</span><span class="sy4">;</span>Mn <span class="sy1">=</span> <span class="nu0">30</span> <span class="sy2">*</span> Ch <span class="sy2">+</span> start<span class="sy4">;</span><span class="br0">&#125;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
<span class="br0">&#125;</span>
<span class="kw4">void</span> Func2<span class="br0">&#40;</span><span class="kw4">int</span> start<span class="br0">&#41;</span>
<span class="br0">&#123;</span>
&nbsp; &nbsp; mpz_class mpz_Ch <span class="sy1">=</span> <span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; mpz_class mpz_Mn <span class="sy1">=</span> <span class="nu0">30</span> <span class="sy2">*</span> mpz_Ch <span class="sy2">+</span> start<span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>mpz_Mn <span class="sy1">&lt;=</span> mpz_Ostatok2<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>mpz_divisible_p<span class="br0">&#40;</span>mpz_Ostatok.<span class="me1">get_mpz_t</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, mpz_Mn.<span class="me1">get_mpz_t</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy1">==</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#123;</span>mpz_Ch<span class="sy2">++</span><span class="sy4">;</span>mpz_Mn <span class="sy1">=</span> <span class="nu0">30</span> <span class="sy2">*</span> mpz_Ch <span class="sy2">+</span> start<span class="sy4">;</span><span class="br0">&#125;</span><span class="co1">//проверка на делимость</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; EnterCriticalSection<span class="br0">&#40;</span><span class="sy3">&amp;</span>cs<span class="br0">&#41;</span><span class="sy4">;</span><span class="co1">//критическая секция</span>
&nbsp; &nbsp; &nbsp; &nbsp; mpz_Ostatok <span class="sy1">=</span> mpz_Ostatok <span class="sy2">/</span> mpz_Mn<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; mpz_Ostatok2 <span class="sy1">=</span> <span class="kw3">sqrt</span><span class="br0">&#40;</span>mpz_Ostatok<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>option <span class="sy1">==</span> <span class="nu0">3</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="co1">//проверка на выбранную опцию</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>mpz_oldMn <span class="sy3">!</span><span class="sy1">=</span> mpz_Mn<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>y <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span> y <span class="sy1">&lt;=</span> Solutions<span class="sy4">;</span> y<span class="sy2">++</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mpz_ArrRez<span class="br0">&#91;</span>Solutions <span class="sy2">+</span> y<span class="br0">&#93;</span> <span class="sy1">=</span> mpz_ArrRez<span class="br0">&#91;</span>y<span class="br0">&#93;</span> <span class="sy2">*</span> mpz_Mn<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> mpz_ArrRez<span class="br0">&#91;</span>Solutions <span class="sy2">+</span> y<span class="br0">&#93;</span> <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Solutions <span class="sy1">=</span> Solutions <span class="sy2">+</span> y <span class="sy2">-</span> <span class="nu0">1</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>y2 <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span> y2 <span class="sy1">&lt;</span> y<span class="sy4">;</span> y2<span class="sy2">++</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mpz_ArrRez<span class="br0">&#91;</span>Solutions <span class="sy2">+</span> y2<span class="br0">&#93;</span> <span class="sy1">=</span> mpz_ArrRez<span class="br0">&#91;</span>Solutions <span class="sy2">-</span> y <span class="sy2">+</span> <span class="nu0">1</span> <span class="sy2">+</span> y2<span class="br0">&#93;</span> <span class="sy2">*</span> mpz_Mn<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> mpz_ArrRez<span class="br0">&#91;</span>Solutions <span class="sy2">+</span> y2<span class="br0">&#93;</span> <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Solutions <span class="sy1">=</span> Solutions <span class="sy2">+</span> y2 <span class="sy2">-</span> <span class="nu0">1</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span>mpz_oldMn <span class="sy3">!</span><span class="sy1">=</span> mpz_Mn <span class="sy3">||</span> option <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">2</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> Solutions<span class="sy2">++</span><span class="sy4">;</span> std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> mpz_Mn <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span> <span class="br0">&#125;</span> <span class="co1">//или</span>
&nbsp; &nbsp; &nbsp; &nbsp; mpz_oldMn <span class="sy1">=</span> mpz_Mn<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; LeaveCriticalSection<span class="br0">&#40;</span><span class="sy3">&amp;</span>cs<span class="br0">&#41;</span><span class="sy4">;</span><span class="co1">//критическая секция</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
<span class="br0">&#125;</span>
<span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span> &nbsp; InitializeCriticalSection<span class="br0">&#40;</span><span class="sy3">&amp;</span>cs<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="co1">////////////////////вывод большого количества строк в консоль</span>
&nbsp; &nbsp; HANDLE &nbsp;hout <span class="sy1">=</span> GetStdHandle<span class="br0">&#40;</span>STD_OUTPUT_HANDLE<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; COORD &nbsp;size<span class="sy4">;</span>
&nbsp; &nbsp; size.<span class="me1">X</span> <span class="sy1">=</span> <span class="nu0">100</span><span class="sy4">;</span> &nbsp; <span class="co1">// кол-во символов на строку</span>
&nbsp; &nbsp; size.<span class="me1">Y</span> <span class="sy1">=</span> <span class="nu0">10010</span><span class="sy4">;</span> &nbsp;<span class="co1">// увеличиваем до нужного размера - количества переменных</span>
&nbsp; &nbsp; SetConsoleScreenBufferSize<span class="br0">&#40;</span>hout, size<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="co1">////////////////////</span>
&nbsp; &nbsp; std<span class="sy4">::</span><span class="me2">string</span> s<span class="sy4">;</span>
&nbsp; &nbsp; std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;Created by 2017, bedvit (bedvit@mail.ru)<span class="es1">\n</span><span class="es1">\n</span>Factorization of a number(factorization)=1<span class="es1">\n</span>Search for prime divisors=2<span class="es1">\n</span>Search for all divisors=3<span class="es1">\n</span>Select a calculation option:= &quot;</span><span class="sy4">;</span>
&nbsp; &nbsp; std<span class="sy4">::</span><span class="kw3">cin</span> <span class="sy1">&gt;&gt;</span> option<span class="sy4">;</span>
&nbsp; &nbsp; std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;Enter the numeric: &quot;</span><span class="sy4">;</span>
&nbsp; &nbsp; std<span class="sy4">::</span><span class="kw3">cin</span> <span class="sy1">&gt;&gt;</span> s<span class="sy4">;</span>
&nbsp; &nbsp; std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;<span class="es1">\n</span>Result:<span class="es1">\n</span>1&quot;</span> <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw4">unsigned</span> <span class="kw4">int</span> start_time <span class="sy1">=</span> <span class="kw3">clock</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span> <span class="co1">// начальное время</span>
&nbsp; &nbsp; mpz_Ostatok <span class="sy1">=</span> s<span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>mpz_probab_prime_p<span class="br0">&#40;</span>mpz_Ostatok.<span class="me1">get_mpz_t</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="nu0">100</span><span class="br0">&#41;</span> <span class="sy1">==</span> <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; std<span class="sy4">::</span><span class="me2">vector</span><span class="sy1">&lt;</span>std<span class="sy4">::</span><span class="me2">thread</span><span class="sy1">&gt;</span> thr<span class="br0">&#40;</span><span class="nu0">8</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> arr<span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy1">=</span> <span class="br0">&#123;</span> <span class="nu0">0</span>,<span class="nu0">1</span>,<span class="nu0">7</span>,<span class="nu0">11</span>, <span class="nu0">13</span>, <span class="nu0">17</span>, <span class="nu0">19</span>, <span class="nu0">23</span>, <span class="nu0">29</span> <span class="br0">&#125;</span><span class="sy4">;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>mpz_Ostatok <span class="sy1">&gt;</span> <span class="nu0">18446744073709551615</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mpz_Ostatok2 <span class="sy1">=</span> <span class="kw3">sqrt</span><span class="br0">&#40;</span>mpz_Ostatok<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mpz_class mpz_Mn <span class="sy1">=</span> <span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mpz_class mpz_oldMn<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>mpz_Mn <span class="sy1">&lt;=</span> <span class="nu0">30</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>mpz_divisible_p<span class="br0">&#40;</span>mpz_Ostatok.<span class="me1">get_mpz_t</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, mpz_Mn.<span class="me1">get_mpz_t</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy1">==</span> <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> mpz_Mn<span class="sy2">++</span><span class="sy4">;</span><span class="br0">&#125;</span> &nbsp;<span class="co1">//проверка на делимость</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mpz_Ostatok <span class="sy1">=</span> mpz_Ostatok <span class="sy2">/</span> mpz_Mn<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mpz_Ostatok2 <span class="sy1">=</span> <span class="kw3">sqrt</span><span class="br0">&#40;</span>mpz_Ostatok<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>option <span class="sy1">==</span> <span class="nu0">3</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="co1">//проверка на выбранную опцию</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>mpz_oldMn <span class="sy3">!</span><span class="sy1">=</span> mpz_Mn<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>y <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span> y <span class="sy1">&lt;=</span> Solutions<span class="sy4">;</span> y<span class="sy2">++</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mpz_ArrRez<span class="br0">&#91;</span>Solutions <span class="sy2">+</span> y<span class="br0">&#93;</span> <span class="sy1">=</span> mpz_ArrRez<span class="br0">&#91;</span>y<span class="br0">&#93;</span> <span class="sy2">*</span> mpz_Mn<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> mpz_ArrRez<span class="br0">&#91;</span>Solutions <span class="sy2">+</span> y<span class="br0">&#93;</span> <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Solutions <span class="sy1">=</span> Solutions <span class="sy2">+</span> y <span class="sy2">-</span> <span class="nu0">1</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>y2 <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span> y2 <span class="sy1">&lt;</span> y<span class="sy4">;</span> y2<span class="sy2">++</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mpz_ArrRez<span class="br0">&#91;</span>Solutions <span class="sy2">+</span> y2<span class="br0">&#93;</span> <span class="sy1">=</span> mpz_ArrRez<span class="br0">&#91;</span>Solutions <span class="sy2">-</span> y <span class="sy2">+</span> <span class="nu0">1</span> <span class="sy2">+</span> y2<span class="br0">&#93;</span> <span class="sy2">*</span> mpz_Mn<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> mpz_ArrRez<span class="br0">&#91;</span>Solutions <span class="sy2">+</span> y2<span class="br0">&#93;</span> <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Solutions <span class="sy1">=</span> Solutions <span class="sy2">+</span> y2 <span class="sy2">-</span> <span class="nu0">1</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span>mpz_oldMn <span class="sy3">!</span><span class="sy1">=</span> mpz_Mn <span class="sy3">||</span> option <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">2</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> Solutions<span class="sy2">++</span><span class="sy4">;</span> std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> mpz_Mn <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span> <span class="br0">&#125;</span> <span class="co1">//или</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mpz_oldMn <span class="sy1">=</span> mpz_Mn<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span> i <span class="sy1">&lt;=</span> <span class="nu0">8</span><span class="sy4">;</span> i<span class="sy2">++</span><span class="br0">&#41;</span> thr<span class="br0">&#91;</span>i <span class="sy2">-</span> <span class="nu0">1</span><span class="br0">&#93;</span> <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">thread</span><span class="br0">&#40;</span>Func2, arr<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span> i <span class="sy1">&lt;=</span> <span class="nu0">8</span><span class="sy4">;</span> i<span class="sy2">++</span><span class="br0">&#41;</span> thr<span class="br0">&#91;</span>i <span class="sy2">-</span> <span class="nu0">1</span><span class="br0">&#93;</span>.<span class="me1">join</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>mpz_Ostatok <span class="sy1">&gt;</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#123;</span><span class="co1">//проверяем остаток</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>option <span class="sy1">==</span> <span class="nu0">3</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>mpz_oldMn <span class="sy3">!</span><span class="sy1">=</span> mpz_Ostatok<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>y <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span> y <span class="sy1">&lt;=</span> Solutions<span class="sy4">;</span> y<span class="sy2">++</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mpz_ArrRez<span class="br0">&#91;</span>Solutions <span class="sy2">+</span> y<span class="br0">&#93;</span> <span class="sy1">=</span> mpz_ArrRez<span class="br0">&#91;</span>y<span class="br0">&#93;</span> <span class="sy2">*</span> mpz_Ostatok<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> mpz_ArrRez<span class="br0">&#91;</span>Solutions <span class="sy2">+</span> y<span class="br0">&#93;</span> <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Solutions <span class="sy1">=</span> Solutions <span class="sy2">+</span> y <span class="sy2">-</span> <span class="nu0">1</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>y2 <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span> y2 <span class="sy1">&lt;</span> y<span class="sy4">;</span> y2<span class="sy2">++</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mpz_ArrRez<span class="br0">&#91;</span>Solutions <span class="sy2">+</span> y2<span class="br0">&#93;</span> <span class="sy1">=</span> mpz_ArrRez<span class="br0">&#91;</span>Solutions <span class="sy2">-</span> y <span class="sy2">+</span> <span class="nu0">1</span> <span class="sy2">+</span> y2<span class="br0">&#93;</span> <span class="sy2">*</span> mpz_Ostatok<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> mpz_ArrRez<span class="br0">&#91;</span>Solutions <span class="sy2">+</span> y2<span class="br0">&#93;</span> <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Solutions <span class="sy1">=</span> Solutions <span class="sy2">+</span> y2 <span class="sy2">-</span> <span class="nu0">1</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span> std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> mpz_Ostatok <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span> Solutions<span class="sy2">++</span><span class="sy4">;</span> <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Ostatok <span class="sy1">=</span> mpz_Ostatok.<span class="me1">get_ui</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Ostatok2 <span class="sy1">=</span> <span class="br0">&#40;</span><span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span><span class="br0">&#41;</span><span class="kw3">sqrt</span><span class="br0">&#40;</span>Ostatok<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span> Mn <span class="sy1">=</span> <span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span> oldMn<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>Mn <span class="sy1">&lt;=</span> <span class="nu0">30</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>Ostatok<span class="sy2">%</span>Mn <span class="sy1">==</span> <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="co1">//проверка на делимость</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Ostatok <span class="sy1">=</span> Ostatok <span class="sy2">/</span> Mn<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Ostatok2 <span class="sy1">=</span> <span class="br0">&#40;</span><span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span><span class="br0">&#41;</span><span class="kw3">sqrt</span><span class="br0">&#40;</span>Ostatok<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>option <span class="sy1">==</span> <span class="nu0">3</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="co1">//проверка на выбранную опцию</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>oldMn <span class="sy3">!</span><span class="sy1">=</span> Mn<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>y <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span> y <span class="sy1">&lt;=</span> Solutions<span class="sy4">;</span> y<span class="sy2">++</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ArrRez<span class="br0">&#91;</span>Solutions <span class="sy2">+</span> y<span class="br0">&#93;</span> <span class="sy1">=</span> ArrRez<span class="br0">&#91;</span>y<span class="br0">&#93;</span> <span class="sy2">*</span> Mn<span class="sy4">;</span> 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> ArrRez<span class="br0">&#91;</span>Solutions <span class="sy2">+</span> y<span class="br0">&#93;</span> <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span> 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Solutions <span class="sy1">=</span> Solutions <span class="sy2">+</span> y<span class="sy2">-</span><span class="nu0">1</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>y2 <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span> y2 <span class="sy1">&lt;</span> y<span class="sy4">;</span> y2<span class="sy2">++</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ArrRez<span class="br0">&#91;</span>Solutions <span class="sy2">+</span> y2<span class="br0">&#93;</span> <span class="sy1">=</span> ArrRez<span class="br0">&#91;</span>Solutions <span class="sy2">-</span> y <span class="sy2">+</span> <span class="nu0">1</span> <span class="sy2">+</span> y2<span class="br0">&#93;</span> <span class="sy2">*</span> Mn<span class="sy4">;</span> 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> ArrRez<span class="br0">&#91;</span>Solutions <span class="sy2">+</span> y2<span class="br0">&#93;</span> <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Solutions <span class="sy1">=</span> Solutions <span class="sy2">+</span> y2 <span class="sy2">-</span> <span class="nu0">1</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span>oldMn <span class="sy3">!</span><span class="sy1">=</span> Mn <span class="sy3">||</span> option <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">2</span><span class="br0">&#41;</span><span class="br0">&#123;</span>Solutions<span class="sy2">++</span><span class="sy4">;</span>std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> Mn <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span><span class="br0">&#125;</span> <span class="co1">//или</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; oldMn <span class="sy1">=</span> Mn<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span> Mn<span class="sy2">++</span><span class="sy4">;</span> <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span> i <span class="sy1">&lt;=</span> <span class="nu0">8</span><span class="sy4">;</span> i<span class="sy2">++</span><span class="br0">&#41;</span> thr<span class="br0">&#91;</span>i <span class="sy2">-</span> <span class="nu0">1</span><span class="br0">&#93;</span> <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">thread</span><span class="br0">&#40;</span>Func, arr<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span> i <span class="sy1">&lt;=</span> <span class="nu0">8</span><span class="sy4">;</span> i<span class="sy2">++</span><span class="br0">&#41;</span> thr<span class="br0">&#91;</span>i <span class="sy2">-</span> <span class="nu0">1</span><span class="br0">&#93;</span>.<span class="me1">join</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>Ostatok <span class="sy1">&gt;</span> <span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="co1">//проверяем остаток</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>option <span class="sy1">==</span> <span class="nu0">3</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>oldMn <span class="sy3">!</span><span class="sy1">=</span> Ostatok<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>y <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span> y <span class="sy1">&lt;=</span> Solutions<span class="sy4">;</span> y<span class="sy2">++</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ArrRez<span class="br0">&#91;</span>Solutions <span class="sy2">+</span> y<span class="br0">&#93;</span> <span class="sy1">=</span> ArrRez<span class="br0">&#91;</span>y<span class="br0">&#93;</span> <span class="sy2">*</span> Ostatok<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> ArrRez<span class="br0">&#91;</span>Solutions <span class="sy2">+</span> y<span class="br0">&#93;</span> <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Solutions <span class="sy1">=</span> Solutions <span class="sy2">+</span> y <span class="sy2">-</span> <span class="nu0">1</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>y2 <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span> y2 <span class="sy1">&lt;</span> y<span class="sy4">;</span> y2<span class="sy2">++</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ArrRez<span class="br0">&#91;</span>Solutions <span class="sy2">+</span> y2<span class="br0">&#93;</span> <span class="sy1">=</span> ArrRez<span class="br0">&#91;</span>Solutions <span class="sy2">-</span> y <span class="sy2">+</span> <span class="nu0">1</span> <span class="sy2">+</span> y2<span class="br0">&#93;</span> <span class="sy2">*</span> Ostatok<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> ArrRez<span class="br0">&#91;</span>Solutions <span class="sy2">+</span> y2<span class="br0">&#93;</span> <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Solutions <span class="sy1">=</span> Solutions <span class="sy2">+</span> y2 <span class="sy2">-</span> <span class="nu0">1</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span> std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> Ostatok <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span> Solutions<span class="sy2">++</span><span class="sy4">;</span> <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span> std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> s <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span> Solutions<span class="sy2">++</span><span class="sy4">;</span><span class="br0">&#125;</span><span class="co1">//если число простое</span>
&nbsp; &nbsp; <span class="kw4">unsigned</span> <span class="kw4">int</span> end_time <span class="sy1">=</span> <span class="kw3">clock</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span> <span class="co1">// конечное время</span>
&nbsp; &nbsp; <span class="kw4">unsigned</span> <span class="kw4">int</span> search_time <span class="sy1">=</span> end_time <span class="sy2">-</span> start_time<span class="sy4">;</span> <span class="co1">// искомое время</span>
&nbsp; &nbsp; <span class="kw3">printf</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es1">\n</span>Time, sec (min): %f (%f) Solutions: %u<span class="es1">\n</span>&quot;</span>, search_time <span class="sy2">/</span> <span class="nu16">1000.0</span>, search_time <span class="sy2">/</span> <span class="nu16">60000.0</span>, Solutions<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw3">system</span><span class="br0">&#40;</span><span class="st0">&quot;pause&quot;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div>
				   </div>
			   </div><br />
Со всеми оптимизациями алгоритм все равно - <i><b>Экспоненциальный</b></i>.<br />
<b><i>Дальнейшие идеи: </i></b>реализовать метод рационального/квадратичного решета - <b><i>субэкспоненциальный</i></b> алгоритм (на основе идей метода факторизации Ферма). <br />
Что, предполагаю, будет значительно быстрее, чем текущий алгоритм (в особенности на больших числах).<br />
В идеале Общий метод решета числового поля, но он сложнее, много математики, да и <a rel="nofollow noopener noreferrer" href="https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%89%D0%B8%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D1%82%D0%B0_%D1%87%D0%B8%D1%81%D0%BB%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BF%D0%BE%D0%BB%D1%8F" target="_blank" title="https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%89%D0%B8%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D1%82%D0%B0_%D1%87%D0%B8%D1%81%D0%BB%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BF%D0%BE%D0%BB%D1%8F">реализован он уже на С, серьезными командами</a><br />
Моя же цель - попробовать создать алгоритм, человеком не профессионалом по математике/программированию, без распределенный вычислений, на обычном ПК.<br />
<br />
<b>Замечания и предложения принимаются!</b><br />
Последняя версия продукта - <b>C++Dividers.exe</b><br />
<br />
<a rel="nofollow noopener noreferrer" href="https://github.com/bedvit/Factorization" target="_blank" title="https://github.com/bedvit/Factorization">Репозиторий на GitHub</a></div>


<!-- attachments -->
	<div style="margin-top:10px">

		
		
		
		
			<fieldset class="fieldset">
				<legend>Вложения</legend>
				<table cellpadding="0" cellspacing="3" border="0">
				<tr>
	<td><img loading="lazy" decoding="async" class="inlineimg" src="http://www.cyberforum.ru//cyberstatic.net/images/attach/rar.gif" alt="Тип файла: rar" width="16" height="16" border="0" style="vertical-align:baseline" /></td>
	<td><a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=4269&amp;d=1495537318">C++Dividers(последняя_версия_продукта).rar</a> (302.6 Кб, 769 просмотров)</td>
</tr>
				</table>
			</fieldset>
		

	</div>
<!-- / attachments -->
]]></content:encoded>
			<dc:creator>bedvit</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/829006/4754.html</guid>
		</item>
	</channel>
</rss>
