Почему индексация двухмерного массива не конфликтует - PullRequest
0 голосов
/ 26 февраля 2020

Итак, я изучаю 2D массивы и обнаружил, что, поскольку они непрерывно хранятся так же, как 1D массив Почему индексация не конфликтует там?

Вот графическое представление моего двумерного массива

pictorial representation of 2d array

, и здесь я попытался имитировать c, как оно представлено в память.

memory structure of 2d array

Теперь предположим, что arr [0] [0] находится в ячейке памяти x0001 , тогда, когда я пытаюсь access arr [0] [3], который явно является не связанным индексом, как он показывает мне ошибку. Я использую следующую формулу для индексации - (n*m+c)+B для индексации, где

  • n = текущая строка
  • m = Всего столбцов
  • c = текущий столбец
  • B = размер типа данных (для простоты предположим, что B = 1)

Теперь для обр [0] [3] и обр [ 1 ] [0] вывод формулы (n*m+c)+B такой же ( 3 ), и если мы добавим это значение к начальному указателю (x0001) тогда мы получим тот же адрес памяти ( x0001 + 3 = x0004 ), тогда как оператор arr [ 1 ] [0] возвращает 13 (значение в x0004), но arr [0] [3] возвращает индекс из-за связанной ошибки.


Допущения

Поскольку у меня нет четкого представления о том, как память в 2D-массивах на самом деле работаю, я предполагал следующее

  1. Формула (n*m+c)+B практически используется вместо просто теоретического понимания того, как работает 2D-массив.
  2. Адрес является непрерывным и отсчитывается от начального c то есть & обр. [0] [0] => ( x0001 )

Ответы [ 2 ]

2 голосов
/ 26 февраля 2020

Непонятно, что вы подразумеваете под «конфликтом». Это правда, что формула дает одинаковый результат для разных индексов , если показаниям разрешено выходить за пределы ; если значения индекса ограничены допустимыми значениями, конфликт отсутствует.

Разные языки обрабатывают это по-разному (игнорируя те, которые не представляют двумерный массив как непрерывный участок памяти). Один из подходов состоит в том, чтобы игнорировать эту проблему, следуя философии «мусор в мусоре». Другой способ заключается в явной проверке индексов, прежде чем даже попытаться определить местонахождение рассматриваемой ячейки.

1 голос
/ 26 февраля 2020

Учитывая описанное поведение, формула выглядит так:

assert c >= 0 && c < m or out_of_bounds
assert n >= 0 && n < t or out_of_bounds
return s+n*b*m+c*b

Предполагая

s = start
n = current row
m = total columns
t = total rows
c = current column
b = size of datatype
...