Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передать двумерный массив в функцию 
V
    Опции темы
Anikmar
Дата 18.4.2007, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(MAKCim @  18.4.2007,  22:08 Найти цитируемый пост)
он может вычислиться только при условии, что mas находится не в стеке
в случае стека до выполнения esp неизвестен

Я неправильно выразился. Вычисляется прибавлением смещения к базовому адресу, а базовый уже получается либо в стеке либо в куче - все равно.

Просто при статическом объявлении массив сразу залезает в единый блок памяти.

На примере двухмерных массивов:
Мнение, что адрес элемента массива вычисляется как БАЗА + Размерность1*Индекс1+размерность 2 правильное только в отношении статических массивов. Для динамических адрес элемента = Указатель[Индекс1]+Индекс2
PM MAIL ICQ   Вверх
archimed7592
Дата 18.4.2007, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Anikmar @  18.4.2007,  22:04 Найти цитируемый пост)
Да нигде он не хранится!
а че ты мне это говоришь? я этого не утверждал... перечитай мой пост... там везде акцент на слово храниться в кавычках....
Цитата(Anikmar @  18.4.2007,  22:04 Найти цитируемый пост)
В случае динамического определения массива делают так:
это ты так делаешь...это уже массив указателей...
если же оставить обыкновенный двухмерный массив, то абсолютно ничего не изменится (кроме того, что адрес массива теперь будет лежать в определённой переменной):
Код
void f (int a [][5])
{
}

int main ()
{
    int a [10][5];
    f (a);
    
    int (*dynamic_arr)[5] = new int [10][5];
    f (dynamic_arr);
    
    return 0;
}


Добавлено @ 22:22
Цитата(Anikmar @  18.4.2007,  22:16 Найти цитируемый пост)
Для динамических адрес элемента = Указатель[Индекс1]+Индекс2 

для статических тоже:
Код
    int a [10][5];
    int *el_addr = a[3]+2;


Это сообщение отредактировал(а) archimed7592 - 18.4.2007, 22:24


--------------------
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
PM Jabber   Вверх
vinter
Дата 18.4.2007, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(MAKCim @  18.4.2007,  22:02 Найти цитируемый пост)
да не правдвумерный массив N x M (type array[N][M]) - это одномерный массив длины N * M, и доступ к элементу (i, j) осуществляется как array + i * M + j

нет, прав! то что в памяти он лежит линейно, ни о чем не говорит, двумерный массив, это массив, в котором каждый элемент является массивом, и не спорь пожалуйста, это голая теория и с ней спорить не надо. То что в дампе это выглядит иначе это другой разговор, а сейчас разговор о другом.


--------------------
Мой блог
PM MAIL WWW   Вверх
archimed7592
Дата 19.4.2007, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(vinter @  18.4.2007,  23:08 Найти цитируемый пост)
то что в памяти он лежит линейно, ни о чем не говорит, двумерный массив, это массив, в котором каждый элемент является массивом
с этим полностью согласен...


--------------------
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
PM Jabber   Вверх
Anikmar
Дата 19.4.2007, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(archimed7592 @  18.4.2007,  22:19 Найти цитируемый пост)
это ты так делаешь...это уже массив указателей...

А как динамический двумерный массив создаете вы? Есть принципиально другой метод? (без шаблонов, разумеется) Чтобы потом обращаться к нему с помощью стандартного синтаксиса?
PM MAIL ICQ   Вверх
archimed7592
Дата 19.4.2007, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Anikmar @  19.4.2007,  08:46 Найти цитируемый пост)
А как динамический двумерный массив создаете вы?
ну я ж тебе показал... могу ещё раз:
Код
const int fixed_dimension = 5;
int denamic_dimension;
std::cin >> dynamic_dimension;
int (*dynamic_arr)[fixed_dimension] = new int [dynamic_dimension][fixed_dimension];

суть то не в этом smile
суть в том, что двумерный массив, вне зависимости от его месторасположения (automatic/static/dynamic storage duration), передают в ф-цию одинакового...


--------------------
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
PM Jabber   Вверх
HappyLife
Дата 19.4.2007, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 17.5.2006

Репутация: 3
Всего: 8



Спасибо братки) Поддержали smile 

Это сообщение отредактировал(а) HappyLife - 19.4.2007, 09:21
PM MAIL   Вверх
Anikmar
Дата 19.4.2007, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(archimed7592 @  19.4.2007,  08:52 Найти цитируемый пост)

ну я ж тебе показал... могу ещё раз:
const int fixed_dimension = 5;
int denamic_dimension;
std::cin >> dynamic_dimension;
int (*dynamic_arr)[fixed_dimension] = new int [dynamic_dimension][fixed_dimension];


Упс. Чего то я не понял. 
Это же не динамический двумерный массив. Это получится динамический массив массив из 5 фиксированных элементов - по сути одномерный, если рассматривать массив из 5 элементов как отдельный тип данных.

А каким образом вы создадите динамически двумерный массив, где оба измерения динамические?

Цитата(archimed7592 @  19.4.2007,  08:52 Найти цитируемый пост)
суть то не в этом 
суть в том, что двумерный массив, вне зависимости от его месторасположения (automatic/static/dynamic storage duration), передают в ф-цию одинакового... 

Это естественно. Главное знать границы

PM MAIL ICQ   Вверх
MAKCim
Дата 19.4.2007, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(vinter @  18.4.2007,  23:08 Найти цитируемый пост)
нет, прав! то что в памяти он лежит линейно, ни о чем не говорит, двумерный массив, это массив, в котором каждый элемент является массивом, и не спорь пожалуйста, это голая теория и с ней спорить не надо

ну раз теория, тогда каждый элемент в двумерном массиве является просто элементом определенного типа, а не массивом как сказал ты, это раз
во-вторых массив - понятие обобщенное, одномерный, двумерный и т.д массивы - частные случаи массива как линейной последовательности элементов, на которой можно задать функции вида F(i): X -> Y(i), где i - количество индексов, X - исходная последовательность, Y - функция от количества индексов в массиве
т. е F(2) = X -> Y(2) (каждому элементу из X поставим в соответствие элемент из Y(2) = {a1 * N2 + a2}, где N2 - вторая размерность массива, a1, a2 - индексы), аналогично, F(3) = X -> Y(3) (Y(3) = {a1 * N3 + a2 * N2 + a3}), продолжая, получим
Y(i) = {a1 * Ni + a2 * Ni-1 + ... + ai}


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
betal
Дата 19.4.2007, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 26.12.2006

Репутация: нет
Всего: 1



Цитата(Voldemar2004 @  18.4.2007,  22:07 Найти цитируемый пост)
Это мы представляем двумерный массив в виде таблицы, а 3-хмерный в виде куба, а ведь это одномерный вектор памяти, так ?

Он располагается в физической памяти как одномерный массив. Ибо по другому он не умеет.
Суть только в адресах. И в адресах которые хранят указатель на другие адреса.
Дабы правильно увидеть это представляй его в виде таблици или куба.  smile 
--------------------
101100010100001101100001110100101111011легкие деньги
PM WWW ICQ   Вверх
Anikmar
Дата 19.4.2007, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Что-то на счет теории я недопониаю. Существует отдельная теория о массивах?
Например в языке Бейсик прямо в описании языка говорилось, что двумерный массив представляет собой большой одномерный.
А в описании Си говорится, что многомерный массив - это массив массивов и совсем необязательно, что он занимает единый блок памяти.

Тут речь идет не о теории, а о конкретной реализации способа хранения многомерных массивов. В языке Си их по сути 2. Но смысл массива от этого не меняется.
PM MAIL ICQ   Вверх
archimed7592
Дата 19.4.2007, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Anikmar @  19.4.2007,  09:33 Найти цитируемый пост)
А каким образом вы создадите динамически двумерный массив, где оба измерения динамические?
Цитата(Anikmar @  19.4.2007,  09:33 Найти цитируемый пост)
Это естественно.

вот и славненько smile
ты наверное забыл с чего всё началось smile :
Цитата(betal @  18.4.2007,  21:36 Найти цитируемый пост)
а в случаи если массивы находятся в Динамической памяти то






--------------------
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
PM Jabber   Вверх
betal
Дата 19.4.2007, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 26.12.2006

Репутация: нет
Всего: 1



Начнем с того в чем разница между переменной и массивом ?!?
В том что массив хранит в себе массив переменных одного типа.

Что-то тип того по имени мы получаем доступ к началу (адресу) первого элемента массива. А номер уже указывает на адресс массива + его порядковый номер в этом массиве

--------------------
101100010100001101100001110100101111011легкие деньги
PM WWW ICQ   Вверх
archimed7592
Дата 19.4.2007, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Anikmar @  19.4.2007,  09:42 Найти цитируемый пост)
В языке Си их по сути 2. Но смысл массива от этого не меняется. 
второй, это надо понимать массив указателей? тогда, имхо, смысл меняется, хоть и работа с ним выглядит также(но не всегда - передача в ф-цию к примеру)

Добавлено через 1 минуту и 21 секунду
Цитата(betal @  19.4.2007,  09:51 Найти цитируемый пост)
Начнем с того в чем разница между переменной и массивом ?!?
массив - это тип... абстракция... переменная - сущность...


--------------------
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
PM Jabber   Вверх
HappyLife
Дата 19.4.2007, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 17.5.2006

Репутация: 3
Всего: 8



Давайте закончим сыр бор на пустом месте.
Ведь достаточно открыть Страуструп 3 издание, приложение B раздел 7. Где все это описано.
PM MAIL   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0584 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.