![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| betal |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 208 Регистрация: 26.12.2006 Репутация: нет Всего: 1 |
--------------------
101100010100001101100001110100101111011легкие деньги |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
вот и я про то же массив - последовательность элементов определенного типа можно на нем задать функции, получая при этом эквивалентные массивы большей размерности, но при этом массив остается массивом не зависимо от того как мы его себе представляем (одномерный, двумерный и т. д) -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
-------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Вовсе нет, я имею в виду 2 способа хранения. Если честно, я не лез в ассемблерный код, к какому общему виду приводит компилятор работу с массивом, но думаю все-таки к варианту динамического создания. Я говорю про способ извлечения конкретного элеменгта массива. Допустим мы имеем статический массив int a[4][6]; Потом получаем доступ к элементу: a[2][3] = 1; Как компилятор получает доступ к такому элементу? Если рассматривать массив как единый блок памяти, то очень просто: a + (6 * 2) + 3; - Получаем адрес искомого элемента Если рассуждать с точки зрения массива указателей, то алгоритм рассчета несколько другой (тоже очень просто): a[2] + 3; Я на 99% уверен, что компилятор в конечном итоге рассчитывает адрес именно по второму способу - так как он более общий. А в случае статического массива указатели физически хранить не надо, а их можно вычислить. А по вашему что там? int a[3][4]; int *p; p = a[2]; Какое значение получит p, как не указатель? Другой вопрос, что физически он может там и не храниться. |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
ну эт типа сказать, что sum(2,3) хранит число 5...
-------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
про все компиляторы говорить не буду, но GCC использует первый способ для первого случая -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| betal |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 208 Регистрация: 26.12.2006 Репутация: нет Всего: 1 |
А при чем это здесь? Вы говорите о указателе? Если ДА ?! ТО Общий вид будет примерно таков *(p+2); - это в случаи если массив одномерний а здесь будет немного другой вид Добавлено через 30 секунд --------------------
101100010100001101100001110100101111011легкие деньги |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Я про это и говорю.
В случае с двумерными массивами по первому измерению находятся именно указатели. И необязательно подряд. Храняться они там или вычисляются по ходу пьесы зависит от способа объявления массива не более того. |
|||
|
||||
| dizzy1984 |
|
||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 675 Регистрация: 15.2.2007 Репутация: 3 Всего: 25 |
Предложенные варианты
и
имеют один явный недостаток. А именно в них нельзя передать автоматические массивы произвольной размерности. Вы, конечно, можете возразить, что для таких случаев есть динамическая память. Я согласен. Но она неудобна тем, что ее надо еще не забыть освободить. Я хочу долнить следующим вариантом:
где m - количество элементов в строке матрицы. Однако адресация внутри функции f при таком варианте изменится с
на
Ну и не могу не вмешаться. Часть неразберихи вызвана путаницей. Я вижу 3 ветки обсуждений : 1. Что такое статический и динамический двумерный массив в понимании c++. 2. Что такое одномерная и двумерная матрица в линейной алгебре. 3. Что такое статический и динамический двумерный массив в понимании мэнэджера памяти с++. Нельзя сравнивать вещи из разных "веток" обсуждений. Это сообщение отредактировал(а) dizzy1984 - 19.4.2007, 11:53 |
||||||||||
|
|||||||||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Мой вариант:
Массив динамический, размерность - любая
Доступ к элементу массива - как обычно var[a][b] |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
MAKCim, игра слов. Я еще раз повторяю, допустим мне плевать как они расположены в памяти, и если структурно изобразить как выглядит двумерный массив, то будет именно массив массивов, а на то как оно лежит в памяти и какие формулы используются для преобразования индексов, мне глубоко фиолоетово. А чтобы не было непоняток, так открой любую книгу по С/С++ и посмотри что там написано, нигде не обьясняется так как написал ты. Просто надо уметь признавать свою неправоту, чего от тебя я не заметил за все мое существование на этом форуме
|
|||
|
||||
| archimed7592 |
|
||||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
-------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
||||
|
|||||
| neosapient |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 672 Регистрация: 16.8.2006 Репутация: нет Всего: 4 |
Задал простой вопрос, так все стали флудить вокруг да около... :(
Устал читать В понимании языка С/С++ двумерный массив это массив массивов, то есть массив указателей на массивы. Я думаю многие работали на Бейсике (хотя бы в школе), в котором двумерный массив это единый участок в памяти если приветси псевдокод Mas = array [Y][X] 0 < i < X 0 < j < Y То благодоря последовательному размещению в памяти можем обратиться к ячейке памяти Mas[j][i] == Mas[1][(j-1)*X+i] Возвращаясь на язык С/С++ Буду рассматривать именно бейсиковский двумерный массив Mas[j][i] *(Mas+j)[i] *(*(Mas+j)+i) ----- int( Mas+j*X+i ) Mas[0][j*X+i] Проблема в другом Необходимо правильно указать компилятору, что передается указатель(4-х байтный адрес)начала массива массивов Как правильно преобразовать тип из бейсиковского двумерного массива [][] к указателю ** Это сообщение отредактировал(а) neosapient - 19.4.2007, 14:19 |
|||
|
||||
| neosapient |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 672 Регистрация: 16.8.2006 Репутация: нет Всего: 4 |
Короче, воспользовался
int Mas[Y][X] int* pMas = (int*)Mas; обращение к ячейки *( Mas+j*X+i ) А все навороты делает компилятор Логически разницу между бейсиковским и сишным двумерными массивами могу сравнить с борьбой конструкций IF...THEN...ELSE и SWITCH...CASE...BREAK Я имею в виду (для тех немногих, что не знают), что при использовании SWITCH...CASE...BREAK компилятор не преобразует к дереву из элементов IF...THEN...ELSE, а создает сводную таблицу переходов... |
|||
|
||||
| likehood |
|
|||
|
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
neosapient, делай так:
Добавлено через 1 минуту и 33 секунды смотрю, так и сделал |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |