СТРУКТУРИРОВАННЫЕ ТИПЫ
Любой из структурированных типов (а в Object Pascal их четыре: массивы, записи, множества и файлы) характеризуется множественностью образующих этот тип элементов. Каждый элемент, в свою очередь, может принадлежать структурированному типу, что позволяет говорить о возможной вложенности типов. В Object Pascal допускается произвольная глубина вложенности типов, однако суммарная длина любого из них во внутреннем представлении не должна превышать 2 Гбайт [ 16-разрядные версии операционной системы Windows З.х используют так называемую “ сегментную” модель памяти, поэтому в Delphi 1 любой структурированный тип не может занимать более одного сегмента (65536 байт). ]. В целях совместимости со стандартным Паскалем в Object Pascal разрешается перед описанием структурированного типа ставить зарезервированное слово packed, предписывающее компилятору по возможности экономить память, отводимую под объекты структурированного типа; но компилятор фактически игнорирует это указание: “упаковка” данных в Object Pascal осуществляется автомата-; чески везде, где это возможно. 7.2.1. Массивы Массивы в Object Pascal во многом схожи с аналогичными типами данных в других языках программирования. Отличительная особенность массивов заключается в том, что все их компоненты суть данные одного типа (возможно, структурированного). Эти компоненты можно легко упорядочить и обеспечить доступ к любому из них простым указанием его порядкового номера, например: Type digit = array [0..9] of Char; matrix = array [byte] of Single; Var m: matrix; d: digit; i: integer; Begin m[17]:= ord(d[i-l])/10; End. Описание типа массива задается следующим образом: <имя типа> = array [ <сп.инд.типов> ] of <тип>; Здесь <имя типа> - правильный идентификатор; array, of - зарезервированные слова {массив, из); <сп.инд.типов> - список из одного или нескольких индексных типов, разделенных запятыми; квадратные скобки, обрамляющие список, - требование синтаксиса; <тип> - любой тип Object Pascal. В качестве индексных типов в Object Pascal можно использовать любые порядковые типы, имеющие мощность не более 2 Гбайт (т. е. Кроме LongWord И Int64) Определить переменную как массив можно и непосредственно при описании этой переменной, без предварительного описания типа массива, например: Var a,b: array [1..10] of Real; Обычно в качестве индексного типа используется тип-диапазон, в котором задаются границы изменения индексов. Так как тип <тип>, идущий в описании массива за словом of, - любой тип Object Pascal, то он может быть, в частности, и другим массивом, например: Type mat = array [0..5] of array [-2..2] of array [Char] of Byte; Такую запись можно заменить более компактной: Type mat = array [0..5,-2..2,char] of Byte; Глубина вложенности структурированных типов вообще, а следовательно, и массивов - произвольная, поэтому количество элементов в списке индексных типов (размерность массива) не ограничено, однако суммарная длина внутреннего представления любого массива не может быть больше 2 Гбайт. В памяти ПК элементы массива следуют друг за другом так, что при переходе от младших адресов к старшим наиболее быстро меняется самый правый индекс массива. Если, например, Var a: array [1..2,1..2] of Byte; Begin а[1,1]:= 1; а[2,1] := 2; а[1,2]:= 3; а[2,2]:= 4; End. то в памяти последовательно друг за другом будут расположены байты со значениями 1,3,2,4. Это обстоятельство может оказаться важным при использовании стандартной процедуры копирования памяти MoveMemory. В Object Pascal можно одним оператором присваивания передать все элементы одного массива другому массиву того же типа, например: Var a,b: array [1..5] of Single; Begin а:= b; End. После этого присваивания все пять элементов массива а получат те же значения, что и в массиве в. Замечу, что объявление Var a: array [1..5] of Single; b: array [1..5] of Single; создаст разные типы массивов, поэтому оператор а:= b; вызовет сообщение об ошибке. Над массивами не определены операции отношения. Нельзя, например, записать if а = b then... Сравнить два массива можно поэлементно, например: Var a,b: array [1..5] of Single; eq: Boolean; i: Byte; Begin eq := True; for i:= 1 to 5 do if a[i] <> b[i] then eq:= False/if eq then end.
|