Перевод в ОПЗ переменных с индексами

Пусть требуется вычислить выражение (b + a[i+1, j] * c + d).

Адрес переменной с индексами дает функция упорядочения.

Пусть массив А: array [i1..k1, …, in..kn] хранится в виде вектора, определяемого описанием B: array [1..N], где

n

N = ∏ (km - im + 1).

m=1

Функция упорядочения позволяет по индексам элемента исходного массива A[j1,…, jn] вычислить соответствующий индекс элемента l массива В.

n

l = 1 + ∑ (jm - im) D m, где при отображении массива А в массив В «строками» (т.е. быс-

m=1

трее меняется последней индекс) - Dn = 1 и Dm = (km+1 – im+1 + 1) Dm+1, m = n-1, …, 1,

а при отображении «столбцами» - D1 = 1 и Dm = (km-1 – im-1 + 1) Dm-1, m = 2, …, n.

Для определения адреса хранения a элемента A[j1,…, jn] в случае, когда вектор B имеет базу b, формулу функции упорядочения целесообразно преобразовать к виду

n

a = b + c +(∑ jmDm) t,

m=1

n

где c = (∑ imDm) t, а t – размер элемента массива в байтах.

m=1

Постоянная величина c, как и коэффициенты Dm зависит только от значений граничных пар в описании массива А.

Для вычисления адреса элемента массива нужно знать базу отображающего вектора b, размерность массива n и n целых чисел. При отображении «строками» это коэффициенты:

c, D1, …, Dn-1,

коэффициент Dn здесь всегда равен 1.

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

Для распределения памяти необходимо знать число элементов в каждом массиве N. При отображении массива «строками» N = D0 = (k1 – i1 + 1) D1.

Все перечисленные величины хранятся в виде так называемого «определяющего вектора» массива. Для массивов с одинаковыми описаниями – определяющий тоже вектор один.

Введем операцию АДРЕС ЭЛЕМЕНТА МАССИВА (АЭМ), результат выполнения которой – адрес элемента массива, а операнды – идентификатор массива и значения индексных выражений.

Будем обозначать операцию АЭМ символами k], где k – количество операндов, а ] – знак операции.

Если n – число индексов, то k = n + 1.

Тогда ОПЗ выражения (b + a[i+1, j]) * c + d будет выглядеть следующим образом:

b a i 1 j + 3 ] + c * d +.

Действие квадратных скобок похоже на действие круглых. Открывающая индексная скобка всегда записывается в вершину стека, но вместе с ней в вершину стека записывается и начальное (минимальное) значение счетчиков операндов операции АЭМ, равное 2.

Запятая, разделяющая индексные выражения, выталкивает из стека все знаки операций до ближайшей открывающей индексной скобки исключительно. Каждая запятая добавляет в счетчик операндов операции АЭМ единицу.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: