Языки программирования - концепции и принципы

в том, что можно получить


T:Array_of_Array('A1..>ZI);

I: Integer;

С: Character;

T('X')(I*3):=T(C)(6);

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

Ada

Т('Х') :=T('Y');                                  -- Присвоить массив из 10 элементов

Недостаток же в том, что для элементов второй размерности должны быть за­даны



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

     В языке С доступен только второй метод и, конечно, только для целочис­ленных индексов:

C

inta[10][20];

 а[1] = а[2];                               /* Присвоить массив из 20 элементов */

Язык Pascal не делает различий между двумерным массивом и массивом мас­сивов; так как границы считаются частью типа массива, это не вызывает ни­каких проблем.

5.7. Реализация массивов

 

При реализации элементы массива размещаются в памяти последовательно. Если задан массив А, то адрес его элемента A(l) есть (см. рис. 5.2.):

addr (А) + size (element) * (/ - A.'First)

Например: адрес А(4) равен 20 + 4 * (4 - 1) = 32.



Сгенерированный машинный код будет выглядеть так:

L

oad        R1,l                       Получить индекс

sub         R1,A'First            Вычесть нижнюю границу

multi      R1 ,size                Умножить на размер — > смещение

add         R1 ,&А               Добавить адрес массива — > адрес элемента

load        R2,(R1)               Загрузить содержимое

Вы, возможно, удивитесь, узнав, что для каждого доступа к массиву нужно столько команд! Существует много вариантов оптимизации, которые могут улучшить этот код. Сначала отметим, что если A'First — ноль, то нам не нужно вычитать индекс первого элемента; это объясняет, почему разработ­чики языка С сделали так, что индексы всегда начинаются с нуля.

Содержание раздела