Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Открытые массивы

Type

Type

Type

Статические (стандартные) массивы

5.2.1 Вектор

Объявление вектора или одномерного массива имеет следующий общий вид (здесь и в дальнейшем используем рекомендацию, в соответствии с которой структурированный пользовательский тип объявляется отдельно от объявления переменной этого типа):

<имя типа> = Array [<ограниченный тип>] Of <тип элементов>;

Var <имя массива>: <имя типа>;

Например:

TarrVect = Array [-2..10] Of Integer;

TarrStudent = Array [0..100] Of TStudent;

TStroka = Array [0..10] Of Char;

Var A, B: TarrVect;

arrStudent: TarrStudent;

S: TStroka;

Здесь объявлены два одинаковых массива A и B, все элементы которого имеют тип Integer, и один массив arrStudent, с базовым типом TarrStudent, объявленным в подразделе 5.2. Количество элементов в каждом массиве A и B равно 13, массив arrStudent содержит 101 элемент. Массив символов S - это фактически строка, с ним можно обращаться как со строкой.

В рассмотренных примерах индексы были заданы ограниченным целым типом. Так чаще всего и бывает, но это не обязательно. Для индексации массива могут использоваться любые ограниченные или перечислимые типы. Можно определить массив arrColor следующим образом:

Color = (Red, Green, Blue);

Var arrColor: Array [Color] Of Real;

Теперь можно обратиться, например, ко второму элементу вектора arrColor как arrColor[Green].

Не запрещается задавать индекс символами.

Физическая структура вектора представляется в ма­шинной памяти последовательностью одинаковых по длине участков памяти (слотов), каждый из кото­рых предназначен для хранения одного элемента вектора. Обычно элементы вектора располагаются в памяти в по­рядке возрастания адресов соответствующих им слотов. Дескриптор вектора может содержать такие поля, как имя вектора, адрес в памяти его начально­го элемента (т. е. первого слота), нижняя и верхняя грани­цы индекса, тип элемента и размер слота. Физическая структура вектора A, объявленного выше, показана на рисунке 5.1.

 

 

 

Рисунок 5.1 - Пример физической структуры вектора с базовым типом Integer

 

 

При доступек любому элементуимя вектора и текущий индекс элемента преобразуются в физический адрес слота, в котором располагается этот элемент. Как видно из рисунка5.1, ло­гическая и физическая структуры вектора совпадают, и то и другое - линейные последовательности элементов. Если в логической структуре при переходе от одного элемента к другому последовательному элементу индекс изменяется на единицу, то при переходе между последовательными элементами в физической структуре, адрес изменяется на величину, равную размеру слота базового типа.

5.2.2 Многомерные статические массивы

Как было отмечено выше, вектор - это одномерный массив. Во всех языках программирования можно объявлять и многомерные массивы, т. е. массивы, элементами которых являются массивы. Например, двумерный массив можно объявить следующим образом:

Type TarrMatr = Array [0..5] Of Array [0..3] Of Word;

Var X: TarrMatr;

То же самое можно объявить более компактно:

Type TarrMatr = Array [0..5, 0..3] Of Word;

Var X: TarrMatr;

Доступ к значениям элементов многомерного массива обеспечивается с помощью имени переменной типа «массив» и индексов, перечисляемых через запятую, например, X[3, 0]. Количество указываемых индексов должно быть равно размерности массива: для доступа к элементу М-мерного массива необходимо указать М индексов.

Все элементы массива имеют один и тот же тип. В отличие от вектора для массива общего вида преобразование логической структуры в физическую имеет более сложный вид. Это преобразование выполняется путем линеаризации, в ходе которой М-мерная логическая структура массива преобразуется в одномерную физиче­скую структуру, представляющую собой линейно упорядо­ченную последовательность слотов. Такое преобразование реализуется с помощью подходящей функции упорядочения, аргументом которой является упорядоченный набор индек­сов элемента, а значением - адрес соответствую­щего слота. Например, если последовательность однотипных элементов трактуется как двумерный массив, и нижние границы индексов i и j равны 0, то адрес (i, j)-элемента матрицы вычисляется с помощью следующей функции упорядочения:

Адрес(i, j) = база + Nrow * SizeOf(Element) * i + j,

где база - адрес начального элемента массива,

Nrow - количество элементов в строке,

SizeOf(Element) - размер слота элемента в байтах,

Хотя физическая структура М-мерного массива при линейном упорядочении его элементов в памяти совпадает с физической структурой вектора, дескриптор массива отличается от дескриптора вектора. В частности, в полях дескриптора массива может содержаться следующая ин­формация:

- поле типа структуры;

- поле имени массива, например, Matr;

- поле, содержащее размерность массива;

- адрес массива в памяти (база);

- поля, содержащие пары граничных значений индек­сов, число этих полей равно размерности массива;

- поля, содержащие специальные индексные множите­ли (их число равно размерности массива), необходи­мые для использования в функции упорядочения;

- поле базового типа массива;

- поле, содержащее размер слота для элемента.

Для массивов в Delphi определена операция присваивания. Если два массива A и B типа TarrVect определены, с помощью нотаций, приведенных в п. 5.2.1, то в результате выполнения оператора

A:= B;

значения элементов массива В скопируются в элементы массива А.

Но если объявить массивы как

Var A: Array [-2..10] Of Integer;

B: Array [-2..10] Of Integer;

то при попытке присваивания A:= B компилятор Delphi выдаст сообщение об ошибке несовместимости типов. Дело в том, что компилятор считает, что переменные имеют один и тот же тип только в случае, если они объявлены в одном и том же списке или они явно определены через некоторый поименованный тип. Это еще один аргумент в пользу использования имен типов в описаниях структурированных переменных.

5.2.3 Свойства статических массивов

Статические массивы характеризуются следующими свойствами:

- постоянство структуры в течение всего времени ее существования,

- смежность элементов и непрерывность области па­мяти, отводимой сразу для всех элементов структуры.

- простота и постоянство отношений между элемента­ми структуры, позволяющие исключить информацию об этих отношениях из области памяти, выделенной для эле­ментов структуры, и хранить ее в компактной форме в де­скрипторах.

В списке параметров, помещаемом в заголовках функций и процедур, допускается указывать массивы. Если размер воспринимаемого массива фиксирован, то в списке параметров тип такого параметра задается только с помощью идентификатора типа. Подпрограммы Object Pascal могут воспринимать также массивы, размер которых неизвестен. В этом случае в заголовке подпрограммы после записи имени параметра-массива указывается слово array, а затем базовый тип, а описание индексов не приводится. Например,

Procedure InverArray(D: Array Of Real;

Var T: Array Of Real);

Такие массивы (как D и T) называются открытыми массивами.

При таком определении массивов D и T тот массив, который передается в процедуру InverArray первым в качестве фактического параметра, будет копироваться в стек, и с этой копией - массивом D - будет работать процедура. Второй открытый массив (массив Т) определен как Var. Этот массив передается «по ссылке», т. е. он не копируется в стек, и процедура будет работать с тем массивом, который был передан в качестве фактического параметра при вызове InverArray.

Массив, переданный как открытый, воспринимается в теле процедуры или функции как массив с целыми индексами, начинающимися с нуля. При этом не имеет значения, как был объявлен диапазон для индекса в массиве, переданном в процедуру в виде фактического параметра.

<== предыдущая лекция | следующая лекция ==>
Общая характеристика массивов | Динамические массивы
Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 349; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.048 сек.