Статьи Программирование Pascal
Динамический массив в Pascal
Автор: Blacksus
Как-то раз, изучая Turbo Pascal, я столкнулся с проблемой отсутствия в нем динамических массивов. Два дня были потрачены на безрезультатные поиски решения этой проблемы. Но, к сожалению, в интернете было больше вопросов, чем ответов, связанных с этой проблемой. А все ответы были примерно одинаковыми, приводился код:
Складывалось такое впечатление, что люди, которые это писали, либо не читали сам вопрос, либо никогда не включали Turbo Pascal, и просто не понимали, что этот пример работает только на Delphi.
Когда я понял, что все поиски бессмысленны, я сам сел за решение этой задачи. На следующий день проблема была решена. И, т.к. ответов на этот вопрос я так и не нашел, я решил написать эту статью, чтобы другие юные программисты столкнувшись с этой проблемой не изобретали каждый раз колесо, а воспользовались готовым решением.
Итак, в данной статье будет рассмотрен один из способов создания двумерного динамического массива, и процедуры для работы с ним.
Для начала приведу общую схему этого массива, рисунок 1.

Рисунок 1
Как видно из рисунка, организация этой структуры полностью идентична двумерному массиву. Доступ к элементам будет осуществляться с помощью специальных процедур, они будут рассмотрены ниже. Ссылка «link» всегда указывает на первый элемент списка, он нужен для процедуры поиска нужного элемента.
Теперь разберемся с процедурами, типами и переменными.
Объявление пользовательских типов:
Глобальные переменные, используемые в процедурах. aa - ссылка, указывающая на первый элемент массива. Эта переменная является самим массивом.
Функция поиска заданного элемента, напрямую она не используется и нужна для работы процедур получения и установки данных элемента. Возвращаемое значение - ссылка на элемент массива.
Функция извлечения данных из элемента массива. В нее передаются следующие параметры: i - номер строки, j - номер столбца. Возвращаемое значение - данные элемента массива.
Процедура сохранения данных в элемент массива. В нее передаются следующие параметры: i - номер строки, j - номер столбца, el - значение, которое будет сохранено.
Процедура для создания массива. В нее передаются следующие параметры: myi - количество строк, myj - количество столбцов.
Процедура очищения памяти, используется при выходе из программы:
Как видите, ничего особо сложного для понимания тут нет, всего 5 процедур и 2 пользовательских типа.
Теперь приведу небольшой пример программы, которая создает массив 10х10, записывает данные, равные номер строки + номер столбца, в каждый элемент, затем получает их обратно и выводит на экран весь массив. Чтобы не загромождать пример, будем считать, что все процедуры и типы уже описаны в программе.
Рабочий исходник программы можно скачать тут.
При желании, можно написать процедуру-аналог SetLength, которая будет на лету устанавливать размер массива, но с этим, я думаю, вы справитесь сами. |