Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции Все Разделы.docx
Скачиваний:
17
Добавлен:
21.09.2019
Размер:
607.75 Кб
Скачать
      1. Многомерные статические массивы

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

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 выдаст сообщение об ошибке несовместимости типов. Дело в том, что компилятор считает, что переменные имеют один и тот же тип только в случае, если они объявлены в одном и том же списке или они явно определены через некоторый поименованный тип. Это еще один аргумент в пользу использования имен типов в описаниях структурированных переменных.