Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЯВУ лекции.doc
Скачиваний:
18
Добавлен:
27.10.2018
Размер:
592.38 Кб
Скачать

Последовательный и прямой доступ к компонентам файла

Смысл последовательного доступа заключается в том, что в каждый момент времени доступна лишь одна компонента из всей последовательности. Для того, чтобы обратиться (получить доступ) к компоненте с номером К, необходимо просмотреть от начала файла К-1 предшествующую компоненту. После обращения к компоненте с номером К можно обращаться к компоненте с номером К+1.

Файл вначале строится при помощи последовательного добавления компонент в конец, а затем может последовательно просматриваться от начала до конца.

Стандартные процедуры ввода/вывода обеспечивают последовательный доступ. Для типизированных и нетипизированных файлов, можно применять прямой доступ. Прямой доступ означает возможность заранее определить компонент файла, к которому будет применена операция ввода - вывода.

Прямой доступ предполагает, что файл представляет собой линейную последовательность компонент нумеруемую от 0 до n-1, где n – текущее количество компонент в файле. В файле существует текущая позиция – номер компоненты, с которой будет осуществляться следующая операция ввода/вывода. При открытии файла текущая позиция устанавливается в 0.

Реализация прямого доступа осуществляется с помощью подпрограмм:

Функция FileSize(f) – возвращает количество компонент в файле f.

Функция FilePos(f) – возвращает текущую позицию в файле f.

Процедура Seek(f,N) – устанавливает текущую позицию в файле f.

Процедура Truncate(f) – удаляет все компоненты от текущей позиции до конца файла f.

Процедурный тип

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

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

Type

<имя_типа>=procedure [(<сп_форм_парам>)] [of object];

<имя_типа>=function [(<сп_форм_парам>)]:<тип_результата>;

Если процедурный тип используется для хранения метода класса, то при описании типа необходимо указать of object.

Для переменных процедурного типа применима операция присваивания:

<имя_перем>:=<имя_подпр.>

<имя_перем> - имя переменной процедурного типа

<имя_подпр.> - имя подпрограммы с таким же заголовком, что и у процедурного типа.

Переменная процедурного типа фактически содержит адрес подпрограммы.

Для переменной процедурного типа применяется специальное значение Nil, которое означает, что переменная не содержит адреса подпрограммы.

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

Вариантный тип

Иногда возникает необходимость работы с типами данных, которые не могут быть определены во время разработки приложения или тип которых изменяется. Для этого в язык Object Pascal были введены так называемые вариантные типы данных. Переменные вариантного типа могут содержать данные разных типов, кроме структурных типов данных, указателей и типа Int64. Для объявления переменной вариантного типа используется слово variant. Все типы являются совместимыми с типом variant, и компилятор делает необходимые преобразования типов автоматически.

Переменная вариантного типа может принимать два дополнительных значения:

Unassigned - не определено;

Null - значение неизвестного типа или значение потеряно.

Пример

Var

V1, V2, V3, V4, V5: Variant;

I: Integer;

D: Double;

S: string;

begin

V1 := 1; // целое значение V2 := 1234.5678; // действительное значение V3 := 'Это строка!'; // строковое значение V4 := '1000'; // строковое значение V5 := V1 + V2 + V4; // действительное значение, равное 2235.5678

I := V1; // I=1 (целое значение)

D := V2; // D = 1234.5678 (действительное значение) S := V3; // S = 'Это строка!' (строковое значение) I := V4; // I = 1000 (целое значение) S := V5; // S = '2235.5678' (строковое значение)

end;