
Структурированные типы
Любой из структурированных типов (массивы, записи, множества и файлы) характеризуется множественностью образующих этот тип элементов. Каждый элемент, в свою очередь может принадлежать структурированному типу, что позволяет говорить о возможной вложенности типов.
В Object Pascal допускается произвольная глубина вложенности типов, однако суммарная длина любого из них во внутреннем представлении не должна превышать 2 Гбайт.
Массивы
Одним из наиболее часто используемых структурированных типов является массив. Отличительной особенностью массивов является то, что все их компоненты суть данные одного типа (возможно структурированного). Эти компоненты можно легко упорядочить и обеспечить доступ к любому из них простым указанием его порядкового номера.
Массивы в Object Pascal во многом схожи с аналогичными типами данных в других языках программирования.
В Object Pascal можно одним оператором присвоения передать все элементы одного массива другому массиву того же типа, например
b: = a;
сравнивать два массива можно поэлементно.
Динамические массивы
В версии Delphi 4 введены так называемые динамические массивы. При объявлении таких массивов не указываются границы индексов:
VAR
A: array of Integer;
B: array of array of Char;
C: array of array of array of real;
Распределение памяти и указание границ индексов по каждому измерению динамических массивов осуществляется в ходе выполнения программы путём инициации массива с помощью функции Set Length .
В ходе выполнения такого оператора: Set Length (А, З); одномерный массив А будет инициирован, т.е. получит память, достаточную для размещения трёх целочисленных значений.
Записи
Записи – это структура данных, состоящая из фиксированного числа компонентов, называемых полями записи. В отличие от массива, компоненты (поля) записи могут быть различного типа. Чтобы можно было ссылаться на тот или иной компонент записи, поля именуются.
Структура объявления типа записи такова:
< имя типа > = record < список полей > END
Здесь < имя типа > - правильный идентификатор; record, end (запись, конец); <список полей > - представляет собой последовательность разделов записи, между которыми ставится точка с запятой.
Каждый раздел записи состоит из одного или нескольких идентификаторов полей, отделяемых друг от друга запятыми.
Например:
type
Birth Day = record Day, Month: Byte; Year: Word
END:
VAR a,b: Birthday;
В этом примере тип Birth Day (день рождения) есть запись с полями Day, Month и Year (день, месяц, год).
К каждому из компонентов записи можно получить доступ, если использовать составное имя, т.е. указать имя переменной, затем точку и имя поля. Например: a.day: = 27; b.year: = 1940;.
Множества
Множества – это наборы однотипных логически связанных друг с другом объектов. Характер связей между объектами лишь подразумевается программистом и никак не контролируется Object Pascal. Количество элементов, входящих в множество, может меняться в пределах от 0 до 256 (множество, не содержащее элементов, называется пустым). Множества отличаются от массивов и записей непостоянством количества своих элементов.
Два множества считаются эквивалентными тогда, когда все их элементы одинаковы, причём порядок следования элементов в множестве безразличен. Если все элементы одного множества входят также и в другое, говорят о включении первого множества во второе. Пустое множество включается в любое другое.
Описание типа множества имеет вид:
< имя типа > set of <базовый тип>;
где < имя типа > - идентификатор, set of ( множество из ) < базовый тип > - базовый тип элементов множества, в качестве которого может использоваться любой порядковый тип, кроме Word, Integer, Long Int.
Пример определения и задания множеств:
Type digitChar = set of ‘0’……..’9’ digit = set of 0………..9
Var S1, S2, S:digitChar S4, S5, S6:digit;
Begin
S1: = [‘1’, ‘2’, ‘3’];
S2: = [‘3’, ‘2’, ‘1’];
S3: = [‘2’, ‘3’,];
S4: = [0…3, 6]; S5: = [4,5];
S6: = [3…9]; END.
Над множествами определены следующие операции:
*пересечение множеств; результат содержит элементы, общие для обоих множеств; например, S4*S6 содержит [3];
+объединение множеств; результат содержит элементы первого множества, дополненные недостающими элементами из второго множества;
S4 + S5 содержит [0,1,2, 3, 4, 5, 6];
- разность множеств, результат содержит элементы из первого множества, которые не принадлежат второму:
S6 – S5 = [3, 6, 7, 8, 9];
= проверка эквивалентности; возвращает True, если оба множества эквивалентны;
< > проверка неэквивалентности; возвращает True, если оба множества неэквивалентны;
< = проверка вхождения; возвращает True, если первое множество включено во второе;
< = проверка вхождения: возвращает True, второе множество включено в первое;
IN проверка принадлежности; возвращает True, если выражение имеет значение, принадлежащее множеству:
3 in S6 возвращает True;
INCLUDE – включает новый элемент во множество.
Обращение к процедуре
Include (S,I);
EXCLUDE – исключает элемент из множества. Обращение:
Exclude [S,I];
Строки
Для обработки текстов в Object Pascal используются следующие типы:
короткая строка Short String или String[N], N<=255;
длинная строка String;
широкая строка Wide String;
нуль-терминальная строка Pchar.
Общим для этих типов является то, что каждая строка трактуется как одномерный массив символов, количество символов в котором может меняться в работающей программе: для String [N] длина строки меняется от 0 до N, для String и Pchar – от 0 до 2Гбайт.
В стандартном Паскале используются только короткие строки String [N].
В Windows широко используются нуль терминальные строки, представляющие собой цепочки символов, ограниченные символом # 0.
В 32-разрядных версиях Delphi введён новый тип String. При работе с этим типом память выделяется по мере надобности (динамически) и ограничена имеющейся в распоряжении программы доступной памятью.
Для совместимости с компонентами, основывающимися на OLE-технологии, в Delphi32 введены также широкие строки, объявляемые стандартным типом Wide String, но отличаются от них тем, что для представления каждого символа используются не один, а два байта.
Варианты
Вариант – это тип Variant, разработанный специально для тех случаев, когда на этапе компиляции программист не может сказать, какого типа данные будут использоваться в выражении или как параметры вызова подпрограмм. Переменная – вариант занимает в памяти дополнительные 2 байта, в которые помещается информация о действительном типе переменной. Эта информация позволяет компилятору создать код, который будет осуществлять необходимое преобразование типов на этапе прогона программы.
В переменную – вариант можно поместить:
- целое или вещественное число;
- логическое выражение;
- строку;
- время и/или дату;
- OLE-объект;
массив произвольной размерности и длины, содержащий элементы
одного из перечисленных выше типов.
Значением варианта может быть массив данных, такие варианты называются вариантными массивами.
Значениями элементов вариантного массива могут быть любые допустимые для варианта значения, кроме строк Var. String. Значениями элементов вариантного массива могут быть и варианты, а это значит, что в таком массиве могут одновременно храниться данные разных типов (и, в том числе, строки 1).
При участии вариантов в выражениях, а также при присвоении их значений переменным других типов тип размещённых в варианте данных преобразуется по следующим правилам:
К чему Приводится |
Тип данных в варианте |
|||||
Var. Empty |
Целые |
Вещественные |
Дата-время |
Строковые |
Логические |
|
К целым |
0 |
Преобразование в соответствующий тип |
Округление до ближайшего целого |
Округление до ближайшего целого |
Преобразование в целый тип |
0 для False, иначе 1 для-True |
К вещественным |
0.10 |
Преобразование в соответствующий тип |
Преобразование в соответствующий тип |
Преобразование в соответствующий тип |
Преобразование. в вещественный тип |
0 для False – 1 для True |
К “дата-время” |
30.12.1899 00;00;00 |
Преобразование в Double |
Преобразование в Double |
Без преобразований |
Преобразование в дату |
Преобразование в Double |
К строковым
|
Пустая строка |
Преобразование в символьный тип |
Преобразование в символьный вид |
Преобразование в символьный вид |
Без преобразования |
«0» для False «-1» для True |
К логическим |
False |
False для 0, иначе True |
False для 0, иначе True |
False для «0», иначе True |
False для “False”,---------для «0»,иначе True |
Без преобразования |
В этой таблице к целым отнесены:
Var. Byte, Var Smoll Int, Var. Integer, Var. Error;
К вещественным – Var. Single, Var. Double, Var. Currency;
К строковым - Var. String, Var. Olestr.
Значением варианта может быть массив данных, такие варианты называются вариантными массивами.
Значениями элементов вариантного массива могут быть любые допустимые для варианта значения, кроме строк Var. String. Значениями элементов вариантного массива могут быть и варианты, а это значит, что в таком массиве могут одновременно храниться данные разных типов (и, в том числе, строки 1).