Все поля располагаются последовательно, размер каждого поля соответствует размерности его базового типа. При этом происходит «выравнивание». Также записи дополняются, для гарантии, что они закончены, 4-х байтовой границей.
Set
Формы Бэкуса-Наура:
!бнф
Диапазон значений:
Любой порядковый тип с элементами, для которых функция Ord возвращает значения в диапазоне от 0 до 255
Пример:
type CharSet = set of char; Digits = set of '0'..'9'; SeasonSet = set of(Winter,Spring,Summer,Autumn);
Константы:
Нет
Допустимые операции:
+ объединение
- разность
* пересечение
Операция in проверяет принадлежность элемента множеству
Процедуры и функции:
нет
Ввод/вывод:
Чтобы вывести значения элементов множества, необходимо перебрать всевозможные значения в цикле и проверить их на принадлежность множеству с помощью операции in:
for i:=0 to 255 do if i in st then write(i,' ');
Представление в памяти:
Хранится в побитовой структуре, но занимает целое число байт, количество которых определяется размерностью множества.
Например, если множество определяется как ‘0’..’9’ (т.е. содержит десять элементов), в памяти будет выделено под него два байта. Один байт = 8 бит, а нам нужно разместить 10 бит, т.е. округляем «вверх» до шестнадцати и получаем два байта. Для пустого множества все биты равны нулям. Далее, в памяти все биты нумеруются и если элемент с определенным номером добавляется в множество, то каждый соответствующий бит (с этим же номером) принимает значение 1.
4. Перечислимый !описание
Пример:
type Season = (Winter,Spring,Summer,Autumn); DayOfWeek = (Mon,Tue,Wed,Thi,Thr,Sat,Sun);
Представление в памяти:
Значения перечислимого типа занимают 4 байта.
5. Ограниченный !описание
Интервальный тип представляет собой подмножество значений целого, символьного или перечислимого типа и описывается в виде a..b, где a - нижняя, b - верхняя граница интервального типа:
var a: 0..10; c: 'a'..'z'; d: Mon..Thr;
Тип, на основе которого строится интервальный тип, называется базовым для этого интервального типа. Значения интервального типа занимают 4 байта.
File – типизированные файлы
Формы Бэкуса-Наура:
!бнф
Диапазон значений:
нет
Константы:
Input, output – зарезервированные переменные для ввода/вывода
Процедуры и функции:
Assign(f, ‘путь’) – ассоциация файловой переменной с файлом
Reset(f) – открытие файла на чтение
Rewrite(f) – открытие файла на запись
Close(f) – закрытие файла
EoF(f) – проверка, достигнут ли конец файла (результат – boolean)
Seek(f, физический номер) – смещение на позицию в файле
FileSize(f) – получает размер файла
FilePos(f) – получает текущую позицию в файле (физический номер «предыдущего» элемента)
Truncate(f) – удаляет все элементы типизированного файла с текущей позиции файлового указателя до конца файла
Ввод/вывод:
Read(f, значение) – если файл открыт для чтения
Write(f, значение) – если файл открыт для записи
Представление в памяти:
Как на жестком диске
Pointer
Формы Бэкуса-Наура:
!бнф
Описание:
Существуют типизированные указатели (содержат адрес ячейки памяти данного типа) и бестиповые указатели (содержат адрес оперативной памяти, не связанный с данными какого-либо определенного типа).
Тип указателя на тип T имеет форму ^T, например:
type pinteger=^integer; var p: ^record r,i: real end;
Бестиповой указатель описывается с помощью слова pointer.
Для доступа к ячейке памяти, адрес которой хранит типизированный указатель, используется операция разыменования ^:
var i: integer; pi: ^integer; ... pi:=@i; // указателю присвоили адрес переменной i pi^:=5; // переменной i присвоили 5
Операция разыменования не может быть применена к бестиповому указателю.
Типизированный указатель может быть неявно преобразован к бестиповому:
typepreal=^real; var p: pointer; pr: ^real; ... p:=pr;
Обратное преобразование может быть выполнено только явно:
pr:=preal(p); pr^:=3.14;
Константы:
Nil – «указатель, который никуда не указывает»
Допустимые операции:
Указатели можно сравнивать на равенство (=) и неравенство (<>). В дополнение к этому типизированные указатели можно сравнивать, используя операции <, >, <=, >=.
Процедуры и функции:
New(p) - процедура; p - типизированный указатель; выделяет динамическую память размера, равного размеру типа, на который указывает p, и возвращает указатель на нее в переменной p
Dispose(p) - процедура; p - типизированный указатель; освобождает динамическую память по указателю p, ранее выделенную процедурой New
GetMem(p,n) - процедура; p - указатель любого типа, n - integer; выделяет динамическую память размера n байт и возвращает указатель на нее в переменной p
FreeMem(p) - процедура; p - указатель любого типа; освобождает динамическую память по указателю p, ранее выделенную процедурой GetMem
FillMem(v,count,x) - процедура; v - переменная любого типа, count - integer,
x - byte; заполняет count значениями x область памяти, занимаемую переменной v. Контроль выхода за границы не производится
CopyMem(src,dest,count) - процедура; src, dest - pointer, count - integer; копирует count байт из памяти, расположенной по адресу src, в память, расположенную по адресу dest. Допускается использовать перекрывающиеся диапазоны памяти.
Ввод/вывод:
нет
String – строки
Формы Бэкуса-Наура:
!бнф
Диапазон значений:
Длина строки: 1..255
Константы:
нет
Допустимые операции:
Сравнения: =, <, >, <>
Происходит «посимвольное» сравнение
Процедуры и функции:
Length(s) - функция; s - string; результат - integer; возвращает длину строки s.
Copy(s,index,count) - функция; s - string, index и count - integer; результат - string; возвращает подстроку строки s длины count, начиная с позиции index.
Delete(s,index,count) - процедура; s - string, index и count - integer; удаляет в строке s count символов начиная с позиции index.
Insert(subs,s,index) - процедура; s, subs - string, index - integer; вставляет подстроку subs в строку s с позиции index.
Pos(subs,s) - функция; s, subs - string; результат - integer; возвращает позицию первой подстроки subs в строке s (или 0 если подстрока не найдена).
SetLength(s,n) - процедура; s - string, n - integer; устанавливает длину строки s равной n.
Str(x,s), Str(x:n,s), Str(x:n:m,s) - процедура; s - string, x - integer, real и n, m - integer; преобразует x к строковому представлению (во втором и третьем случаях согласно формату вывода, устанавливаемому n и m) и записывает результат в строку s.
Val(s,v,code) - процедура; s - string, v - integer, real, и code - integer; преобразует строку s к числовому представлению и записывает результат в переменную v. Если преобразование возможно, то в переменной code возвращается 0, если невозможно, то в code возвращается ненулевое значение.
Concat(s1,...,sn) - функция; s1,..., sn - string; результат - string; возвращает строку, являющуюся результатом слияния строк s1,..., sn. Результат тот же, что у выражения s1+s2+...+sn .
Также можно работать с каждым символом непосредственно как с переменной символьного типа, обращаясь к нему как к элементу массива (нумеруются начиная с единицы, обращение к нулевому символу считается ошибочным).
Ввод/вывод:
Допустимы (read/readln/write/writeln)
Представление в памяти:
Де-факто строка – это массив символов. Занимает число байт, равное размерности строки + 1, т.е.первый байт отводится под значение размерности.