Опубликован: 07.04.2008 | Уровень: специалист | Доступ: платный
Лекция 22:

Динамические массивы

< Лекция 21 || Лекция 22: 123 || Лекция 23 >
Аннотация: В этой лекции вы познакомитесь с динамическими массивами, научитесь управлять размерностью и обработкой таких массивов, создадите программу "Телефонный справочник", в которой используется запись, динамический массив типа этой записи и типизированный файл.

В течение курса мы нередко употребляли в программах массивы и знаем, что они объявляются таким образом:

Имя_массива: array [длина_массива] of тип_данных;

Мы знаем, что типы данных могут быть любыми, а длина массива указывается в виде диапазона от начального, до конечного значения. Работать с такими массивами очень удобно, однако проблема в том, что они не могут менять свой размер. А если мы заранее не знаем, какой размер должен быть у массива?

Допустим, у нас в программе есть пользовательские настройки. То есть, несколько пользователей зарегистрировались в программе и имеют право на ее использование. Каждый из них желает, чтобы программа сохраняла его настройки, чтобы потом ему не приходилось перенастраивать ее. К примеру, размер и положение главного окна. Одному удобно, когда окно справа. Другой желает видеть его слева. А третий и вовсе, хочет, чтобы оно было развернуто во весь экран! Выход? Создать запись для сохранения настроек пользователя, и объявить массив типа этой записи. Каждому пользователю будет принадлежать свой индекс этого массива. Однако, очень редко бывает, когда программист заранее знает количество зарегистрированных пользователей. Какой размер массива делать тогда, 10? А вдруг пользователей будет меньше, тогда у массива будут пустые индексы... А вдруг больше?! Тогда будет переполнение массива, программа выдаст ошибку и не сможет работать... На помощь приходят динамические массивы.

Динамическими называются массивы, при объявлении которых размер не указывается. А во время выполнения программы такие массивы могут изменять длину.

Объявляются такие массивы обычным образом, в разделе переменных:

var
   da : array of Integer;

Как видите, здесь указано, что объявляется массив целых чисел, однако длина при этом не указывается. В дальнейшем с таким массивом мы можем проделывать различные действия – увеличивать или уменьшать его длину, узнавать текущую длину, узнавать низшее и высшее значения диапазона массива, и, конечно, присваивать значения любому из его элементов, или наоборот, считывать эти значения. Ну и конечно, записывать значения массива в файл и считывать их из файла. Познакомьтесь с функциями, которые все это проделывают.

SetLength(массив, длина); Устанавливает указанную длину у указанного массива. Пример:

SetLength(da, 10);

В результате динамический массив da содержит 10 элементов. Обратите внимание, что элементы динамических массивов всегда начинаются с нуля!

Если затем мы напишем:

SetLength(da, 8);

то длина массива уменьшится на 2 элемента. Если эти элементы содержали какое-то значение, они будут уничтожены!

Length(da); Эту функцию мы уже использовали, чтобы узнать длину строки. Она также показывает количество элементов в динамическом массиве. Вспомните, что строка – это просто массив символов, а если мы не оговариваем длины строки, а просто пишем " s : String ", то получаем динамическую строку символов. Нам достаточно присвоить какое-то значение строке, и память будет выделена автоматически под текущий размер этой строки. Однако в случае работы с динамическими массивами, нам самим придется устанавливать их размер.

Low(da); Указывает низший индекс массива da, как правило, это ноль.

High(da); Указывает высший индекс массива. Посмотрите пример:

SetLength(da, 10); //установили размер в 10 элементов
Low(da); //вернет 0, как низший элемент
High(da); //вернет 9, как высший элемент

Таким образом, эти функции удобно использовать в цикле обработки каждого элемента массива:

for i := Low(da) to High(da) do
   da[i] := значение;

Однако перед такими операциями нужно установить какой-то размер массива, иначе произойдет ошибка. Следующий пример проверяет размер массива. Если у массива нет индексов, он устанавливает один индекс:

if Length(da) = 0 then SetLength(da, 1);

Часто бывает необходимо добавить один элемент к массиву, но программист не знает, сколько в данный момент у массива есть элементов. Это можно сделать таким образом:

SetLength(da, Length(da) + 1);

Здесь в качестве устанавливаемого размера мы вначале узнали текущий размер массива, и добавили к нему единицу. Получилось, что мы просто увеличили размер этого массива на 1 элемент.

Этих функций вполне достаточно для работы с динамическими массивами, однако перед применением их на практике, вам следует знать, как работа с динамическими массивами выглядит с точки зрения компьютера.

Когда мы объявляем динамический массив, мы еще не выделяем под него память, просто указываем тип данных, чтобы компьютер знал размерность под каждый элемент.

Когда мы устанавливаем эту размерность функцией SetLength(), компьютер выделяет память под указанное количество элементов. При этом имя массива служит указателем на первый элемент массива в памяти. Компьютеру все равно, какие данные хранятся в элементах, его задача – выделить для этого достаточно памяти. Поэтому удалить какой то элемент внутри массива не так просто.

< Лекция 21 || Лекция 22: 123 || Лекция 23 >
Виктор Пелих
Виктор Пелих

Здравствуйте.
Прохожу курс "Введение в программирование на Delphi"
Добрался до Лекции 29: Введение в базы данных.

Установлена RAD Studio 11.3, у которой отсутствует вкладка BDE и, соответственно, компонент Table,  который обеспечивает доступ к таблице средствами механизма BDE.
Поиск в интернете подсказал 
BDE Installer for RAD Studio, Delphi, C++Builder 10.3 Rio
Подскажите, имеется ли ещё возможность использовать механизм BDE в Delphi11 и если такая возможность есть, как подключить BDE к Delphi11?
С уважением...

 

Федор Антонов
Федор Антонов

Здравствуйте!

Записался на ваш курс, но не понимаю как произвести оплату.

Надо ли писать заявление и, если да, то куда отправлять?

как я получу диплом о профессиональной переподготовке?

Данила Некрасов
Данила Некрасов
Россия, Пермь, ПНИПУ
Сергей Федоров
Сергей Федоров
Россия