![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Динамические массивы
При объявлении динамических массивов не указываются размерность и число элементов (< имя массива> Array Of < тип>), и место в памяти под массив не отводится. Динамическое размещение массива в памяти производится процедурой SetLength (< имя массива>, n1 [, n2]...), где n1, n2,... - число (константа или переменная) элементов в 1, 2,... размерности массива. При первом размещении динамического массива всем элементам присваиваются нулевые значения. Индексы динамического массива ‑ всегда целые числа, начинающиеся с нуля. Повторное применение этой функции к уже существующему массиву изменяет его размер. Если размер увеличен, то все значения элементов сохраняются, а в конце добавляются новые нулевые элементы. Если размер уменьшается, то отсекаются последние элементы, а остаются значения первых элементов. Пример: Var A: Array Of Integer; N, i: Integer; //объявление динамического массива A Begin N: =3; SetLength(A, N); // массив A(0, 0, 0) For i: =0 to N‑ 1 Do A[i]: =i+1; // массив A(1, 2, 3) N: =5; SetLength(A, N); // массив A(1, 2, 3, 0, 0) N: =2; SetLength(A, N); // массив A(1, 2) N: =3; SetLength(A, N); // массив A(1, 2, 0) End Для удаления динамического массива, например, массива A, имеются три варианта: A: =Nil; Finalize(A); SetLength(A, 0). Если A=Nil, то массив A не размещен в памяти. К размещенным в памяти динамическим массивам можно применять функции обработки статических массивов. Если при обращении к динамическому массиву указать только имя массива без индексов, то это означает задание указателя на первый элемент массива. Если динамические массивы (A, B) одного типа (например, Var A, B: Array Of Integer) и размер массива A не меньше размера массива B или массив A не размещен, то запись вида B: =A означает, что переменная B указывает на массив A (В есть псевдоним имени A), и содержимое массива В теряется при этом. Записи Запись ‑ группа компонентов (полей), не обязательно одного типа. Описание этого типа имеет вид: < имя типа> =[Packed] Record< список описаний полей> End; Packed - поля располагаются плотно без пропусков, что уменьшает размер используемой памяти, но увеличивает время обработки. Переменную данного типа можно определить сразу в разделе переменных без предварительного описания типа в виде: < имя переменной типа записи> = [Packed] Record < описание полей> End Полям присваиваются пустые исходные значения: 0 ‑ числовым; пробелы ‑ строковым. Значение константы типа записи задается списком из последовательности вида: имя поля, двоеточие и константа. Пример типизированной константы типа записи: Type Date= Record D: 1..31; M: 1..12; Y: 1900..1999; End; Const Someday: Date=(D: 16; M: 3; Y: 1999) Допускается вложенность записей любого уровня. При обращении к полю указывают имя записи, символ «точка» и имя поля. Для вложенных полей уточнение продолжается. Пример вложенных записей: Type Adress=record //запись с адресом Gorod string[30]; Ulica: string[30]; Dom String[30]; Kvartira: string[10] end; Persona=record //запись с личными данными о человеке Fam: string[40]; datarogdenij: TdataTime; AdressDom, AdressRab: Adress end; Var Director, Sotrudnik: Persona; //объявление записей типа Persona ... Director.AdressDom.Gorod: =’Арамиль’;... Записи могут быть элементами массивов (массив записей). Пример массива записей.Дополним предыдущий пример объявлением массива записей о сотрудниках фирмы. Msotr: array [1..100] of Persona; //массив из 100 записей типа Persona ... Msotr[2].AdressDom.Gorod: =’Екатеринбург’; //дом. адрес 2‑ го сотрудника... Для упрощения доступа к полям используется оператор присоединения вида (п.1.4.9). Пример записи с массивом: Type M=Array [1..5) Of Integer; Rec=Record A: M; S: String; End; … Var P: Rec; … P.A[2]: =1; //пример обращения к переменной P. Допускаются записи с вариантами вида: < тип записи> =Record < описание полей постоянной части> Сase [< имя поля с константой выбора>: ] < имя типа> Of < константа выбора ‑ 1>: (< поле‑ 1>;...< поле‑ i>); ... < константа выбора ‑ n>: (< поле‑ 1>;...< поле‑ j>); End;
Пример типазаписи о товаре с вариантами представления цены: Zap = Record Articul: Integer; //код товара Name: String[40]; //наименование товара Case TypeCena: Boolean Of //тип значения цены True: (CenaI: Integer); //цена - целое число False: (CenaR: Real); //цена ‑ вещественное число End; Var PZap: Zap; {объявление переменной ‑ записи PZap типа Zap} Всем вариантам выделяется одна и та же область памяти. Это можно использовать для преобразования типов, например: Var Numer: Record //запись из одной вариантной части с тремя полями Case Byte Of //признак начала вариантной части 0: (Bn: array [0..3] of Byte); //массив из четырех символов 1: (Wn: array [0..1] of Word); //массив из двух целых типа Word 2: (Ln: LongInt); //целое число типа LongInt End; //окончание записи
|