Адрес массива с размером больше 3
Какова математическая функция, которая дает адрес массива с более чем 3 измерениями? Я уже знаю что за массив a[x][y]
с 2 размерами (a (x * max_second_dimension + y) * byte)
3 ответа
Учитывая массив a[N1][N2][N3]...[Nk]
адрес элемента a[i1][i2]...[ik]
будет равно:
a +
+ i1 * (N2 * N3 * ... * Nk) +
+ i2 * (N3 * N4 * ... * Nk) +
+ i3 * (N4 * N5 * ... * Nk) +
...
+ i(k - 1) * Nk +
+ ik
Вот что следует i
а также N
индексы (и так (k - 1)
в i(k - 1)
,
Пусть размерность массива будет lxbxhxg
что означает, что массив объявлен с использованием
data_type array[l][b][h][g];
если вы хотите адрес ячейки в array[x][y][z][a]
тогда будет
array + (x*b*h*g + y*h*g + z*g + a) * sizeof(array[x][y][z][a])
Существует конечная формула для методов доступа к массивам произвольной размерности, которые я объясню ниже.
Но прежде вы должны знать, что формальные языки обычно обрабатывают многомерные массивы в грамматическом правиле, получая доступ к самому верхнему массиву по индексу, умноженному на размер внутреннего массива - что, в свою очередь, является результатом рекурсии. Это может оказаться в другом массиве, доступ к которому осуществляется по индексу, умноженному на размер внутреннего массива, с определенным смещением и т. Д. До тех пор, пока доступный элемент не станет массивом. Вам следует взглянуть на (например) ANTLR, если вы хотите понять, как работают формальные языки.
Конечно, вы всегда можете найти конкретное выражение, если вы знаете количество измерений и размер каждого измерения. Например: пусть a
быть адресом массива, s
массив размерных размеров, d
количество измерений, c
массив индексов (координаты в пространстве, описываемом массивом) и e
размер элемента. Адрес будет оцениваться в псевдокоде:
a + e * sum(i := 0, d - 1, c[i] * prod(j := i + 1, d - 1, s[j]))
где i
, j
переменные цикла и sum
, prod
являются оператором большой суммы / произведения с соответствующим нижним пределом в первом и верхним пределом во втором параметре. Обратите внимание, что пустой оператор продукта (последняя итерация) приводит к 1. Я не проверял вышеизложенное, но принцип должен быть ясен. Сорра, но я не могу разместить формулы в математической записи здесь.