|
|
<html>
|
|
|
<head>
|
|
|
|
|
|
<title>ALGLIB FAQ</title>
|
|
|
<style type="text/css">
|
|
|
<!--
|
|
|
h1 { font-family: Tahoma,sans-serif; font-size : larger; }
|
|
|
h2 { font-family: Arial,sans-serif; font-size : 11pt; }
|
|
|
h3 { font-family: Arial,sans-serif; font-size : 9pt; }
|
|
|
.cond { color:blue; }
|
|
|
.const { color:#222222; }
|
|
|
.func { color:#111111; }
|
|
|
.smalltext { font-size : 10pt; }
|
|
|
-->
|
|
|
</style>
|
|
|
</head>
|
|
|
<body>
|
|
|
|
|
|
<p align=justify>
|
|
|
<b>C++</b><br>
|
|
|
<span class=smalltext>
|
|
|
<a href="#stdafx">Для чего служит пустой файл <code>stdafx.h</code>?</a><br>
|
|
|
<a href="#cpparrays">Как организована работа с массивами в С++?</a><br>
|
|
|
<a href="#cpparrays2">Почему для обращения к массивам используются не квадратные скобки, а круглые?</a><br>
|
|
|
<a href="#cpp64">Будет ли пакет ALGLIB работать в 64-битной среде?</a><br>
|
|
|
</span><br>
|
|
|
|
|
|
<b>Delphi</b><br>
|
|
|
|
|
|
<span class=smalltext>
|
|
|
<a href="#forwhile">Почему везде вместо цикла for используется цикл while?</a><br>
|
|
|
<a href="#dac">Для чего служит функция <code>DynamicArrayCopy</code>?</a><br>
|
|
|
</span><br>
|
|
|
|
|
|
<b>Вопросы по алгоритмам на Visual Basic</b><br>
|
|
|
|
|
|
<span class=smalltext>
|
|
|
<a href="#vbver">На какую именно версию языка Visual Basic транслируются алгоритмы?</a><br>
|
|
|
<a href="#vbnet">Программы с сайта будут работать в VB.NET?</a><br>
|
|
|
<a href="#vbgoto">Почему в некоторых программах используется оператор goto?</a><br>
|
|
|
</span><br>
|
|
|
|
|
|
<b>Общие вопросы по исходным кодам</b><br>
|
|
|
|
|
|
<span class=smalltext>
|
|
|
<a href="#ap">Что такое библиотека AP?</a><br>
|
|
|
<a href="#ablas">Что такое библиотека ABLAS?</a><br>
|
|
|
<a href="#arr1">Некоторые алгоритмы начинают нумерацию элементов массивов с единицы. Так уже никто не делает!</a><br>
|
|
|
<a href="#arrnz">Язык программирования YYY не поддерживает массивы, нумерация которых начинается не с ноля. Что в этом случае?</a><br>
|
|
|
</span><br>
|
|
|
|
|
|
<b>Общие вопросы по проекту</b><br>
|
|
|
|
|
|
<span class=smalltext>
|
|
|
<a href="#project">В чем цель проекта ALGLIB?</a><br>
|
|
|
<a href="#diff">Чем проект ALGLIB отличается от других аналогичных проектов?</a><br>
|
|
|
<a href="#authors">Кто авторы проекта?</a><br>
|
|
|
<a href="#old">Какое отношение проект имеет к сайтам alglib.chat.ru и alglib.dore.ru?</a><br>
|
|
|
<a href="#manual">Какое отношение проект имеет к проекту MANUAL.RU?</a><br>
|
|
|
<a href="#algopascal">Что такое "алгоритмический Паскаль" (AlgoPascal)?</a><br>
|
|
|
<a href="#bls">Что такое "редактор блок-схем"?</a><br>
|
|
|
<a href="#other">А где алгоритмы для шифрования, рисования графиков, картинок в OpenGL и т.д.?</a><br>
|
|
|
</span><br>
|
|
|
</p>
|
|
|
|
|
|
<hr width=80% size=1>
|
|
|
|
|
|
<h1>C++</h1>
|
|
|
<a name=stdafx><h2>Для чего служит пустой файл <code>stdafx.h</code>?</h2></a>
|
|
|
|
|
|
<p align=justify>
|
|
|
MSVC и некоторые другие компиляторы требуют, чтобы в коде программы присутствовала директива <code>#include <stdafx.h></code>, служащая для управления прекомпилированными заголовками, и автоматически создают файл <code>stfafx.h</code> при генерации нового проекта. Однако некоторые компиляторы (например, BCB) используют другие средства для управления прекомпилированными заголовками. При этом директива <code>#include <stdafx.h></code> сама по себе не мешает их работе, однако отсутствие файла с таким именем приводит к ошибке компиляции. Пустой файл <code>stfafx.h</code> служит для того, чтобы избежать этой ошибки. Если вашей средой разработки уже создан файл с таким именем, оставьте его без изменений.
|
|
|
</p>
|
|
|
|
|
|
<a name=cpparrays><h2>Как организована работа с массивами в С++?</h2></a>
|
|
|
|
|
|
<p align=justify>
|
|
|
Поскольку поддержка динамических массивов со стороны языка С++ отсутствует (<b>update:</b> <i>я знаю про указатели и динамическое выделение памяти, но это не совсем то, что необходимо</i>), то были разработаны классы-шаблоны для работы с одномерными и двухмерными массивами. Необходимый исходный код и описание находятся в стандартной библиотеке AP, которая прилагается к каждому архиву с исходниками на C++. Обратите внимание, что массивы в этой библиотеке начинают нумерацию элементов не с 0, а с произвольного числа по выбору программиста.
|
|
|
</p>
|
|
|
|
|
|
<a name=cpparrays2><h2>Почему для обращения к массивам используются не квадратные скобки, а круглые?</h2></a>
|
|
|
|
|
|
<p align=justify>
|
|
|
Представьте себе, что вы обращаетесь к элементу матрицы а в привычной нотации: <code>a[x][y]</code> вместо <code>a(x,y)</code>. На самом деле здесь спрятан не один вызов оператора индекса, а два. Первый из них - индексация матрицы <code>a</code> по <code>x</code>, которая возвращает ссылку на какую-то временную структуру, описывающую строку матрицы. Второй - индексация временной структуры по <code>y</code>, которая возвращает ссылку на требуемый элемент. Обращение через перегрузку круглых скобок существенно эффективнее, поскольку не требуется создание временных структур.
|
|
|
</p>
|
|
|
|
|
|
<a name=cpp64><h2>Будет ли пакет ALGLIB работать в 64-битной среде?</h2></a>
|
|
|
|
|
|
<p align=justify>
|
|
|
Пакет ALGLIB не тестировался в 64-битной среде.
|
|
|
</p>
|
|
|
|
|
|
<p align=justify>
|
|
|
Вместе с тем, сам пакет и используемая им библиотека AP/C++ не содержат кода, в котором явно выдвигались бы какие-то предположения относительно характера среды, в которой осуществляется работа. Таким образом, компиляция и использование пакета ALGLIB в 64-битной среде теоретически не должны вызывать проблем, если не используются дополнительные библиотеки (такие, как ABLAS, которая на момент написания этих строк существует только в 32-битном варианте).
|
|
|
</p>
|
|
|
|
|
|
<h1>Delphi</h1>
|
|
|
|
|
|
<a name=forwhile><h2>Почему везде вместо цикла <i>for</i> используется цикл <i>while</i>?</h2></a>
|
|
|
|
|
|
<p align=justify>
|
|
|
Причиной тому некоторые особенности реализации цикла <b>for</b> в Delphi. Если цикл не выполнялся не разу, то во многих языках программирования управляющая переменная цикла содержит стартовое значение. В Delphi если цикл не выполнялся не разу, то управляющая переменная цикла не изменяется. Однажды я встретил исходник, в котором эта разница играла большую роль, и решил заменить цикл <b>for</b> в программах на Delphi циклом <b>while</b>, который полностью совпадает по своему поведению с другими языками.
|
|
|
</p>
|
|
|
|
|
|
<a name=dac><h2>Для чего служит функция <code>DynamicArrayCopy</code>?</h2></a>
|
|
|
|
|
|
<p align=justify>
|
|
|
В Delphi динамические массивы являются ссылочными типами, т.е. если параметр-массив передается по значению, то при этом не происходит копирования массива. Для эмуляции передачи параметра-массива по значению используется функция <code>DynamicArrayCopy</code>. Она принимает в качестве аргумента динамический массив и возвращает копию этого массива. Присваивание вида <code>A:=DynamicArrayCopy(A)</code> заменяет ссылку на оригинальный массив ссылкой на его копию.
|
|
|
</p>
|
|
|
|
|
|
<h1>Вопросы по алгоритмам на Visual Basic</h1>
|
|
|
|
|
|
<a name=vbver><h2>На какую именно версию языка Visual Basic транслируются алгоритмы?</h2></a>
|
|
|
|
|
|
<p align=justify>
|
|
|
Алгоритмы транслируются на VBA, однако в целом совместимы с VB6.
|
|
|
</p>
|
|
|
|
|
|
<a name=vbnet><h2>Программы с сайта будут работать в VB.NET?</h2></a>
|
|
|
|
|
|
<p align=justify>
|
|
|
Без портирования - нет.
|
|
|
</p>
|
|
|
|
|
|
<a name=vbgoto><h2>Почему в некоторых программах используется оператор goto?</h2></a>
|
|
|
|
|
|
<p align=justify>
|
|
|
Во многих языках программирования есть управляющий оператор <b>continue</b>, но в VB он отсутствует. Я не знаю, чем объяснить этот факт. Так вот, в программах на AlgoPascal этот оператор время от времени появляется. Оператор <b>goto</b> используется в качестве замены ему, осуществляя досрочный переход к очередной итерации цикла.
|
|
|
</p>
|
|
|
|
|
|
<h1>Общие вопросы по исходным кодам</h1>
|
|
|
|
|
|
<a name=ap><h2>Что такое библиотека AP?</h2></a>
|
|
|
|
|
|
<p align=justify>
|
|
|
Библиотека AP - это общее название набора библиотек на нескольких языках программирования, решающих низкоуровневые задачи, привязанные к специфике конкретного языка программирования. Библиотека решает такие задачи, как работа с динамическими одномерными и многомерными массивами в языках, не поддерживающих этот тип данных, содержит реализации базовых алгоритмов линейной алгебры и т.д. Библиотека распространяется в виде исходных кодов под лицензией BSD. Библиотека автоматически прикрепляется к каждому архиву с алгоритмами, доступному для скачивания с сайта. Последняя версия библиотеки доступна для скачивания по адресу <a href="http://alglib.sources.ru/translator/aplib.zip">http://alglib.sources.ru/translator/aplib.zip</a> или <a href="http://www.alglib.net/translator/aplib.zip">http://www.alglib.net/translator/aplib.zip</a>
|
|
|
</p>
|
|
|
|
|
|
<a name=ablas><h2>Что такое библиотека ABLAS?</h2></a>
|
|
|
|
|
|
<p align=justify>
|
|
|
ABLAS - это оптимизированная реализация базовых алгоритмов линейной алгебры, написанная на ассемблере. Чтобы использовать ABLAS, достаточно скопировать динамически загружаемый файл библиотеки в одну из системных папок или в папку с программой, а также включить поддержку ABLAS (как указано в интструкции к библиотеке). При запуске программы, использующей пакет ALGLIB, осуществляется автоматическое обнаружение и подключение библиотеки ABLAS. В случае отсутствия ABLAS используется стандартная реализация операций линейной алгебры, написанная на языке высокого уровня. На странице <a href="http://www.alglib.net/projects/ablas/">http://www.alglib.net/projects/ablas/</a> (или <a href="http://alglib.sources.ru/projects/ablas/">http://alglib.sources.ru/projects/ablas/</a> для русской версии сайта) находятся описание библиотеки, список поддерживаемых платформ и языков программирования, а также исходные коды и прекомпилированные двоичные файлы.
|
|
|
</p>
|
|
|
|
|
|
<a name=arr1><h2>Некоторые алгоритмы начинают нумерацию элементов массивов с единицы. Так уже никто не делает!</h2></a>
|
|
|
|
|
|
<p align=justify>
|
|
|
Делают. Скажем, библиотека netlib.org содержит мегабайты вполне работоспособного кода на Фортране, в котором принято начинать нумерацию с единицы. В современном мире принято начинать нумерацию с 0, но многие уникальные алгоритмы широко распространяются именно в старой редакции. На данный момент большинство алгоритмов приведено к современной, базирующейся на ноле системе нумерации, однако небольшое количество очень полезных алгоритмов использует старую систему. В перспективе все они будут приведены к новой системе, однако пока приходится использовать их, как есть.
|
|
|
</p>
|
|
|
|
|
|
<a name=arrnz><h2>Язык программирования YYY не поддерживает массивы, нумерация которых начинается не с ноля. Что в этом случае?</h2></a>
|
|
|
|
|
|
<p align=justify>
|
|
|
В этом случае элементы, содержащие ноль в одном из индексов, не будут использоваться. Например, если подпрограмма ожидает получить массив размером 2x2, нумерация которого начинается с 1 (т.е. индексы элементов имеют вид <code>[1..2,1..2]</code>), то в неё следует передать массив с нумерацией элементов <code>[0..2,0..2]</code>. Это не самое красивое решение, но оно работает.
|
|
|
</p>
|
|
|
|
|
|
<h1>Общие вопросы по проекту</h1>
|
|
|
|
|
|
<a name=project><h2>В чем цель проекта ALGLIB?</h2></a>
|
|
|
|
|
|
<p align=justify>
|
|
|
Создать удобную в использовании многоязыковую коллекцию алгоритмов для решения проблем в области численного анализа (в основном) и некоторых других задач.
|
|
|
</p>
|
|
|
|
|
|
<a name=diff><h2>Чем проект ALGLIB отличается от других аналогичных проектов?</h2></a>
|
|
|
|
|
|
<p align=justify>
|
|
|
Пакет ALGLIB:
|
|
|
</p>
|
|
|
|
|
|
<ul>
|
|
|
<li>это многоязыковый проект. Особенность проекта - то, что каждый алгоритм представлен программами на нескольких языках, и список языков один и тот же для всех алгоритмов. Это главное преимущество сайта перед другими подобными коллекциями - один алгоритм, несколько языков, идентичная функциональность на каждом языке.</li>
|
|
|
<li>это коллекция программ. Иногда посетители жалуются на то, что на сайте почти нет описаний используемых алгоритмов. Да, их почти нет - но потому что ALGLIB является коллекцией именно программ, а не описаний используемых алгоритмов. На всё сил не хватит, увы.</li>
|
|
|
<li>специализируется на численном анализе. В рамках проекта представлены и некоторые другие направления (например, есть алгоритмы сортировки и работы с графикой), но приоритетом является именно численный анализ.</li>
|
|
|
<li>легко использовать. Для использования пакета ALGLIB не надо изучать незнакомый язык программирования, подключать дополнительные внешние библиотеки, или работать через громоздкий и неудобный интерфейс к коду, написанному на другом языке программирования.</li>
|
|
|
</ul>
|
|
|
|
|
|
<p align=justify>
|
|
|
Теперь о том, чем ALGLIB не является и не старается быть. ALGLIB:
|
|
|
</p>
|
|
|
|
|
|
<ul>
|
|
|
<li>не соревнуется со специализированными пакетами. Цель проекта не в этом. И как бы я ни старался, мне не обогнать по скорости MKL и не добиться той же широкой функциональности, что и в LAPACK.</li>
|
|
|
<li>не выходит за рамки концепции проекта. Например, параллельные вычисления - это очень интересно, но решение этой проблемы обычно тесно привязано к какой-то конкретной платформе, программной среде и языку, что идет вразрез с главной идеей проекта.</li>
|
|
|
</ul>
|
|
|
|
|
|
<a name=authors><h2>Кто авторы проекта?</h2></a>
|
|
|
|
|
|
<p align=justify>
|
|
|
Первая версия библиотеки алгоритмов была создана Владимиром Быстрицким, и на протяжении нескольких лет он в одиночку развивал сайт. Впоследствии он утратил интерес к сайту, и его развитием по общему согласию занялся я - Сергей Бочканов.
|
|
|
</p>
|
|
|
|
|
|
<a name=old><h2>Какое отношение проект имеет к сайтам alglib.chat.ru и alglib.dore.ru?</h2></a>
|
|
|
|
|
|
<p align=justify>
|
|
|
Это зеркала ранних версий проекта, которые сейчас закрыты.
|
|
|
</p>
|
|
|
|
|
|
<a name=manual><h2>Какое отношение проект имеет к проекту MANUAL.RU?</h2></a>
|
|
|
|
|
|
<p align=justify>
|
|
|
Этот проект помог библиотеке алгоритмов на одном из ключевых этапов развития, предоставив качественный бесплатный хостинг и, что более ценно, PHP-код для нового движка сайта, а также помощь по ряду других вопросов.
|
|
|
</p>
|
|
|
|
|
|
<a name=algopascal><h2>Что такое "алгоритмический Паскаль" (AlgoPascal)?</h2></a>
|
|
|
|
|
|
<p align=justify>
|
|
|
AlgoPascal - это разработанный специально для данного проекта язык программирования. Программы на этом языке обрабатываются программой-транслятором, и затем на их основе строятся исходники на требуемом посетителю языке программирования. Более подробном об этом можно узнать в разделе <a href="http://alglib.sources.ru/aboutsite.php">"О сайте"</a>.
|
|
|
</p>
|
|
|
|
|
|
<a name=bls><h2>Что такое "редактор блок-схем"?</h2></a>
|
|
|
|
|
|
<p align=justify>
|
|
|
Это программа, которая служит для просмотра и редактирования блок-схем. Первоначально все алгоритмы на сайте хранились в виде блок-схем, но затем в качестве основного способа представления был выбран AlgoPascal, на который были переведены блок-схемы. Тем не менее, старые блок-схемы остались на русской версии сайта, хотя их поддержка была прекращена, да и сам редактор может оказаться полезным посетителям. Более подробном об этом можно узнать в разделе <a href="http://alglib.sources.ru/aboutsite.php">"О сайте"</a> и на <a href="http://alglib.sources.ru/aboutbls.php">страничке редактора блок-схем</a>.
|
|
|
</p>
|
|
|
|
|
|
<a name=other><h2>А где алгоритмы для шифрования, рисования графиков, картинок в OpenGL и т.д.?</h2></a>
|
|
|
|
|
|
<p align=justify>
|
|
|
Как уже говорилось, цель библиотеки алгоритмов - создать многоязыковую библиотеку алгоритмов в области численного анализа. Задачи вроде указанных в оглавлении под эту классификацию не попадают. Для некоторых задач делается исключение, но в целом у проекта ярко выраженная специализация.
|
|
|
</p>
|
|
|
|
|
|
</body>
|
|
|
</html>
|