Если возникает необходимость расположить один оператор with внутри другого, то любую переменную (если перед ней явно не указано имя записи), находящуюся под внутренним оператором with, компилятор пытается интерпретировать в такой последовательности:
· если во внутренней записи есть поле с искомым именем, то поиск заканчивается;
· если во внутренней записи поля с таким именем нет, то поиск производится среди полей внешней записи (если вложенных операторов with больше, чем два, то поиск ведется последовательно во всех задействованных записях в направлении "изнутри наружу");
· если среди полей всех вложенных записей нет искомого идентификатора, компилятор считает его глобальной переменной.
Например:
|
|
Запись с вариантной частью
Если заранее известно, что в массиве записей (таблице) некоторые поля могут оставаться пустыми (наборы пустых полей могут быть разными для разных записей), то вполне понятно желание как-то сократить неиспользуемый, но занимаемый объем памяти.
|
|
Специально для таких случаев существуют записи с вариантной частью.
Описание записи с вариантной частью
В разделе var запись с вариантной частью описывают так:
var <имя_записи>: record <поле1>: <тип1>; [<поле2>: <тип2>;] [...] case <поле_переключатель>: <тип> of <варианты1>: (<поле3>: <тип3>;<поле4>: <тип4>;...); <варианты2>: (<поле5>: <тип5>; <поле6>: <тип6>;...); [...] end;end; |
Невариантная часть записи (до ключевого слова case) подчиняется тем же правилам, что и обычная запись. Вообще говоря, невариантная часть может и вовсе отсутствовать.
Вариантная часть начинается зарезервированным словом case, после которого указывается то поле записи, которое в дальнейшем будет служить переключателем. Как и в случае обычного оператора case, переключатель обязан принадлежать к одному из перечислимых типов данных. Список вариантов может быть константой, диапазоном или объединением нескольких констант или диапазонов. Набор полей, которые должны быть включены в структуру записи, если выполнился соответствующий вариант, заключается в круглые скобки.
Пример. Для того чтобы описать содержимое библиотеки, необходима следующая информация:
Для книг | Для газет | Для журналов |
Автор Название Год издания Издательство | Название Дата выхода (день, месяц, год) Издательство | Название Год и месяц издания Номер Издательство |
Графы "Название" и "Издательство" являются общими для всех трех вариантов, а остальные поля зависят от типа печатного издания. Для реализации этой структуры воспользуемся записью с вариантной частью:
|
|
type biblio = record name,publisher: string[20]; case item: char of 'b': (author: string[20]; year: 0..2004); 'n': (data: date); 'm': (year: 1700..2004; month: 1..12; number: integer); end; |
В зависимости от значения поля item, в записи будет содержаться либо 4, либо 5, либо 6 полей.
Механизм использования записи с вариантной частью
Количество байтов, выделяемых компилятором под запись с вариантной частью, определяется самым "длинным" ее вариантом. Более "короткие" наборы полей из других вариантов занимают лишь некоторую часть выделяемой памяти.
В приведенном выше примере самым "длинным" является вариант ‘ b ’: для него требуется 23 байта (21 байт для строки и 2 байта для целого числа). Для вариантов ‘n’ и ‘m’ требуется 4 и 5 байт соответственно (см. таблицу).
name, publisher | item | Вариантная часть | |||
... | ‘b’ | author | year | ||
... | ‘n’ | data | |||
... | ‘m’ | year | month | number | |
... | ‘b’ | author | year | ||