
- •Текстовые файлы, объявление, основные подпрограммы для работы с ними.
- •2) Принцип и особенности реализации надежного определения размерности прямоугольной числовой матрицы.
- •3) Понятие типа данных с управляемым временем жизни.
- •4)Синтаксис объявления динамических массивов, их особенности, внутренняя организация памяти.
- •Основные подпрограммы для работы с динамическими массивами.
- •Способы выделения памяти для многомерных динамических массивов.
- •Способы освобождения памяти, занимаемой динамическим массивом.
- •Длинные строки, их особенности, внутренняя организация памяти.
- •Основные подпрограммы для работы с длинными строками.
- •Способы освобождения памяти, занимаемой длинной строкой.
- •Виды подпрограмм.
- •13) Синтаксис объявления параметров с разными способами передачи.
- •15) Указатели (объявление и работа с ними).
- •Interface
- •Interface
- •Implementation
Основные подпрограммы для работы с динамическими массивами.
Способы выделения памяти для многомерных динамических массивов.
В многомерных массивах сначала устанавливается длина его первого измерения, затем второго, третьего и т. д. Например, вот как создается динамический массив 3×3:
var
A: array of array of Integer;
// Двумерный динамический массив
begin
// Устанавливаем длину первого измерения
// (количество столбцов):
SetLength(A,3);
// Задаем длину каждого столбца:
SetLength(A[0], 3);
SetLength(A[l], 3);
SetLength(A[2], 3) ;
. . .
end;
Замечу, что SetLength - одна из немногих стандартных подпрограмм, которая допускает обращение с переменным количеством параметров. Вместо четырех строк в предыдущем примере можно использовать одну:
SetLength(А, 3, 3);
Обратите внимание: в отличие от обычных массивов стандартного языка Паскаль (и Delphi), динамические массивы могут иметь разную длину по второму и следующим измерениям. В предыдущем примере определен квадратный массив 3×3. Однако ничто не мешает нам создать, например, треугольный массив (обращаться к подпрограмме SetLength с количеством параметров более трех нельзя):
SetLength(A, 3);
// Задаем длину каждого столбца:
SetLength(А[0],3);
SetLength(А[1],4);
SetLength(A[2],5);
В многомерных динамических массивах каждый элемент любого из N-1 измерений (N - количество измерений) представляет собой динамический массив и, следовательно, нуждается в инициализации. Вот как, например, можно инициализировать вещественный кубический массив 3×3×3:
128
var
A: array of array of array of Real;
i, j: Integer;
begin
SetLength(A,3);
for i := 0 to 2 do
begin
SetLength(A[i],3);
for j := 0 to 2 do
SetLength{A[i,j],3);
end;
. . . . .
end;
Способы освобождения памяти, занимаемой динамическим массивом.
Фактически идентификатор динамического массива ссылается на указатель, содержащий адрес первого байта памяти, выделенной для размещения массива. Поэтому для освобождения этой памяти достаточно присвоить идентификатору значение NIL (другим способом является использование процедуры Finalize):
var
А, В: array of Integer;
begin
// Распределяем память:
SetLength(A,10);
SetLength(В,20);
// Используем массивы:
. . .
127
// Освобождаем память:
А := NIL;
Finalize(В);
end;
Длинные строки, их особенности, внутренняя организация памяти.
Длинная строковая переменная string - это всего лишь указатель на специальным образом отформатированный блок памяти. Другими словами, sizeof (stringvar) - sizeof (pointer). Если указатель содержит nil, строка считается пустой. В противном случае указатель указывает непосредственно на последовательность символов, составляющих строку. Функции для работы с длинными строками в библиотеке времени выполнения гарантируют, что строка всегда завершается нулем (null-символом). Благодаря этому, строковую переменную всегда можно легко привести к типу PChar, используемому при вызове API-функций системы. Но, наверное, не все знают, что блок памяти, на который указывает указатель, содержит и некоторую дополнительную информацию. Четыре байта, расположенные до последовательности символов, представляют собой целочисленное значение - длину строки (за исключением завершающего нуля). Предшествующие четыре байта содержат целочисленное значение, представляющее собой счетчик ссылок (для постоянных строк это значение равно -1). Если память для строки выделена из кучи, то предшествующие четыре байта содержат целочисленное значение, представляющее собой полный объем используемого строкой блока памяти, включая все скрытые целочисленные поля, последовательность символов, составляющих строку, и скрытый завершающий null-символ, округленные до ближайших четырех байтов.
Счетчик ссылок присутствует в блоке памяти, поэтому операция
MyOtherString : = MyString выполняется очень быстро. Компилятор преобразует это присвоение за два шага: сначала он увеличивает на 1 счетчик ссылок для строки, на которую указывает MyString, а затем устанавливает указатель MyOtherString равным указателю MyString.