- •Текстовые файлы, объявление, основные подпрограммы для работы с ними.
- •2) Принцип и особенности реализации надежного определения размерности прямоугольной числовой матрицы.
- •3) Понятие типа данных с управляемым временем жизни.
- •4)Синтаксис объявления динамических массивов, их особенности, внутренняя организация памяти.
- •Основные подпрограммы для работы с динамическими массивами.
- •Способы выделения памяти для многомерных динамических массивов.
- •Способы освобождения памяти, занимаемой динамическим массивом.
- •Длинные строки, их особенности, внутренняя организация памяти.
- •Основные подпрограммы для работы с длинными строками.
- •Способы освобождения памяти, занимаемой длинной строкой.
- •Виды подпрограмм.
- •13) Синтаксис объявления параметров с разными способами передачи.
- •15) Указатели (объявление и работа с ними).
- •Interface
- •Interface
- •Implementation
2) Принцип и особенности реализации надежного определения размерности прямоугольной числовой матрицы.
Определяется кол-во элементов 1 строчки, потом 2-ой и они сравниваются, если разное кол-во, значит матрица не прямоугольная, если равны, то определяется 3-я и снова сравниваются, и так далее.
b:=0;
a:=0;
i:=0;
while (not SeekEof(F)) do
Begin
b:=0;
{$I-}
while (not SeekEOLN(F)) do
Begin
Read(F,N);
if(Ioresult<>0) then
Begin
if ErCoord <> NIL then
Begin
ErCoord.t:=ioResult;
ErCoord.X:=a+1;
ErCoord.Y:=b+1;
end;
Result:=4;
Exit;
end;
inc(b);
end;
{$I+}
if(i<>0) then
Begin
if(i<>b) then
Begin
if ErCoord <> NIL then
Begin
ErCoord.z:=a+1;
end;
Result:=5;
Exit;
end;
end;
i:=b;
ReadLn(F);
inc(a);
end;
if(b=0) then
Begin
Result:=2;
Exit;
end;
if (b-a=0) then
Begin
Result:=6;
Exit;
end;
if ((b=1) or (a=1)) then
Begin
Result:=3;
Exit;
end;
3) Понятие типа данных с управляемым временем жизни.
Типы с управляемым временем жизни
Некоторые типы ( String, WideString, Variant, OleVariant, interface и dispinterface ) являются типами с управляемым временем жизни. Особенностью такого рода типов является то, что выделенная для размещения переменной область памяти автоматически возвращается системе после того, как переменная перестает существовать (например, локальные переменные в подпрограммах). Освобождение выделенных ресурсов часто называется "сборкой мусора" (garbage-collected).
Освобождение памяти, выделенной для глобальных переменных, обычно реализуется в ходе завершения работы программы. Для локальных подпрограмм этот процесс приводит к некоторому их усложнению. Пусть, например, имеем такую процедуру:
procedure MyProc;
var
S: String;
begin
// В теле процедуры используется переменная S
end;
В действительности компилятор вырабатывает код, соответствующий такому тексту (о блоках try и finally см. главу 13.):
procedure MyProc;
var
S: String;
begin
S := ' ';
try
// В теле процедуры используется переменная S
finally
// Здесь реализуется освобождение памяти для S
end;
4)Синтаксис объявления динамических массивов, их особенности, внутренняя организация памяти.
Динамические массивы
В версии Delphi 4 впервые введены так называемые динамические массивы. При объявлении динамических массивов в программе не следует указывать границы индексов:
var
A: array of Integer;
В: array of array of Char;
C: array of array of array of Real;
В этом примере динамический массив А имеет одно измерение, массив В - два и массив С - три измерения. Распределение памяти и указание границ индексов по каждому измерению динамических массивов осуществляется в ходе выполнения программы путем инициализации массива с помощью функции SetLength. В ходе выполнения следующего оператора одномерный динамический массив А будет инициализирован, то есть получит память, достаточную для размещения трех целочисленных значений:
SetLength(A,3);
Нижняя граница индексов по любому измерению динамического массива всегда равна 0, поэтому верхней границей индексов для А станет значение 2.
Фактически идентификатор динамического массива ссылается на указатель, содержащий адрес первого байта памяти, выделенной для размещения массива. Поэтому для освобождения этой памяти достаточно присвоить идентификатору значение NIL (другим способом является использование процедуры Finalize):
var
А, В: array of Integer;
begin
// Распределяем память:
SetLength(A,10);
SetLength(В,20);
// Используем массивы:
. . .
127
// Освобождаем память:
А := NIL;
Finalize(В);
end;
При изменении длины уже инициированного динамического массива по какому-либо его измерению сначала резервируется нужная для размещения нового массива память, затем элементы старого массива переносятся в новый, после чего освобождается память, выделенная прежнему массиву. Чтобы сократить дополнительные затраты времени, связанные с изменением границ большого динамического массива, следует сразу создать массив максимальной длины.
В многомерных массивах сначала устанавливается длина его первого измерения, затем второго, третьего и т. д. Например, вот как создается динамический массив 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;
