2014-09-09 5 views
0

Может ли кто-нибудь объяснить мне строку & Обозначение столбца 2-мерного массива в стеке? Мой учитель сказал, что если мы имеем следующую матрицу:представление стека многомерного массива

a00   a01   a02 
a10   a11   a12 
a20   a21   a22 

Column wise representation:      Row Wise representation: 
a00            a00 
a10            a01 
a20            a02 
a01            a10 
a11            a11 
a21            a12 
a02            a20 
a12            a21 
a22            a22 

В то время как я знаю только о представлении многомерного массива в памяти: a00 затем A01 затем A02 затем а10 и так далее (там порядке возрастания адресов)

Я поднял этот вопрос в классе, каково различие представления стека в/в & представление памяти многомерных массивов. Она сказала, что мы делаем двухмерный массив здесь, а не указатель. Что это за ответ. Пожалуйста, объясните мне это.

Она также рассказала некоторые формулы, чтобы вычислить адрес любого элемента 2-D массива представления строк и представления столбцов в стеке. Я этого не понимал.

Местоположение (A [J, K]) = Base_address (A) + W (M (к-1) + (J-1))

+0

Без кода, «стек» не имеет отношения к этому вопросу (и пуристом бы сказать вам, что это ISN 't соответствует даже * с * кодом). – WhozCraig

ответ

1

Вы сказали,

В то время как я знаю только о представлении многомерного массива в памяти: a00 затем A01 затем A02 затем а10 и так далее (там порядке возрастания адресов)

В C/C++, многомерные массивы хранятся используя представление строки.

IIRC, в FORTRAN, многомерные массивы хранятся с использованием представления столбцов.

В C, вы можете определить 2D массив как:

int a[10][3]; 

Когда вы передаете массив функции, он распадается на указатель типа int (*)[3].

Отказ от ответственности:Мой FORTRAN ржавый, поэтому простите любое использование неправильного синтаксиса

В FORTRAN, вы можете определить 2D массив как:

INTEGER A(10, 3) 

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

INTEGER A(10, *) 

The diff в синтаксисе делает более естественным, поскольку многомерные массивы в C должны быть представлены строками, а в FORTRAN для них представляется естественным представлять столбцы.

Вы также сказали:

Location(A[j,k]) = Base_address(A) + W(M(k-1)+(j-1)) 

Кажется, вы используете индекс 1 на основе. Не уверен, что W и M Подставка для.

Предположим, у вас есть ROW количество строк и COL количество столбцов.

Если у вас есть представление строки:

Location(A[j,k]) = Base_address(A) + (j-1)*COL + (k-1) 

Если у вас есть колонки представление:

Location(A[j,k]) = Base_address(A) + (k-1)*ROW + (j-1) 
+0

Многомерные массивы всегда представлены строка мудрая не столбце мудрый? Поэтому я думаю, мой учитель сказал это неправильно, мы изучаем алгоритм с использованием C –

+1

@ StackOverflow32, да, это правильно. Я бы уточнил с ней. Может быть, где-то была какая-то недопонимание. –

1

Вот лучшее представление вашего 2D массива в памяти:

Колонка мудрое представление:

Chip1 Chip2 Chip3 
a00 a01 a02 
a10 a11 a12 
a20 a21 a22 

Row Wise представление:

Chip1 Chip2 Chip3 
a00 a10 a20 
a01 a11 a21 
a02 a12 a22 
+0

ОЗУ или стек? Я не получаю это –

+0

Стек хранится в RAM @ StackOverflow32 – CMPS

+0

@ StackOverflow32 http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap – CMPS

Смежные вопросы