![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| neosapient |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 672 Регистрация: 16.8.2006 Репутация: нет Всего: 4 |
Встала проблема передать двумерный массив в функцию.
Здесь часто поднимались схожие вопросы, но ... не нашел ниодного подходящего ответа
Вот примерно так я планировал передовать массив, передавая в функцию указатель на массив указателей, размер по Y и по X Как я думаю при преобразовании двумерного массива к указателю int** происходит затерание ячеек Mas[j], т.е. там появляются нулевые указатели Как правильно здесь выкрутиться С динамическими массивами работать не хочу |
|||
|
||||
| JackYF |
|
||||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
или
|
||||
|
|||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Mas - это не массив указателей... это двумерный массив... разница колоссальная... ты можешь передать массив определённой размерности с произвольной последней размерностью... void func (int Mas [][X]) Это сообщение отредактировал(а) archimed7592 - 18.4.2007, 17:57 -------------------- 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 |
|||
|
||||
| HappyLife |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 642 Регистрация: 17.5.2006 Репутация: 3 Всего: 8 |
archimed7592,
не согласен. Двумерный массив это массив массивов. И интерпретируеться как *(*(Mas + X) + Y) Где наглядно можно понять, что все такие это массив указателей... Но ничего не затераеться. И Mas[1] - хранит указатель на Mas[1][0] Mas[2] - хранит указаьель на Mas[2][0] Это сообщение отредактировал(а) HappyLife - 18.4.2007, 18:23 |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Нет! HappyLife, юзай поиск по форуму. Не раз уже подобная тема поднималась. |
|||
|
||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
Можешь и так - так сможешь мочить указатель |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
||||
|
||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
При передаче одномерного массива в фунцию в качестве фактического параметра нет разницы как мы объявили оный - int [] arr или int* arr, так как в любом случае будет неявное преобразование int [] в int*. Разница есть при передаче многомерных массивов - в случае с двумерным массивом при int arr [][X] в функцие он будет интепретироваться как (*)[X], то есть sizeof(arr[0][0] / sizeof(int)) выдаст количество элементов в строке.
Или я не понял о чем спор Это сообщение отредактировал(а) Xenon - 18.4.2007, 19:21 |
|||
|
||||
| betal |
|
||||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 208 Регистрация: 26.12.2006 Репутация: нет Всего: 1 |
а в случаи если массивы находятся в Динамической памяти то
Добавлено через 1 минуту и 45 секунд
опять не доглядел Добавлено через 2 минуты и 24 секунды
Это сообщение отредактировал(а) betal - 18.4.2007, 21:36 --------------------
101100010100001101100001110100101111011легкие деньги |
||||||||
|
|||||||||
| archimed7592 |
|
||||||||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
HappyLife,
может быть скажешь мне тогда какой тип у этого указателя? а лучше ничего не говори - покажи на деле:
1. какой должен быть тип someType (помимо того, что это указатель)? 2. где "хранится" этот указатель? 3.
4.
если ещё остались вопросы, дам тебе ссылку на тему из около 20 страниц... может хоть она избавит тебя от твоих илюзий... Добавлено через 2 минуты и 38 секунд почему вдруг ф-ция изменится, если массив будет в Динамической памяти (я так понимаю ты о new/delete говоришь)? -------------------- 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 |
да не прав двумерный массив N x M (type array[N][M]) - это одномерный массив длины N * M, и доступ к элементу (i, j) осуществляется как array + i * M + j Это сообщение отредактировал(а) MAKCim - 18.4.2007, 22:05 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Anikmar |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Да нигде он не хранится! Он вычисляется сразу! Двумерный массив можно рассматривать как массив одномерных массивов. Это четко прописано в стандарте. Уже много раз на эту тему спорили.
Это абсалютно допустимая операция, pointer указатель и получает значение адреса 1-й строчки. Этот адрес в случае статического массива нигде не хранится, а вычисляется на этапе компиляции - так как базовый адрес массива известен. В случае динамического определения массива делают так:
Все нормально компилируется и понимается как надо. |
||||
|
|||||
| Voldemar2004 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1650 Регистрация: 25.12.2004 Репутация: нет Всего: 23 |
Это мы представляем двумерный массив в виде таблицы, а 3-хмерный в виде куба, а ведь это одномерный вектор памяти, так ?
-------------------- i_i (';') (V) ![]() |
|||
|
||||
| MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
он может вычислиться только при условии, что mas находится не в стеке в случае стека до выполнения esp неизвестен Добавлено через 1 минуту и 12 секунд
в случае type array[X1][X2]...[Xn], где Xi - константы, да -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
Просто важно не забывать, что в случае с динамическими массивами - это просто кучка разбросанных по памяти массивов.
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |