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

Поиск:

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


Опытный
**


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

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



Встала проблема передать двумерный массив в функцию.

Здесь часто поднимались схожие вопросы, но ... не нашел ниодного подходящего ответа

Код

#define defY 5
#define defX 6

int Mas[Y][X]

void func (int** ppMas, int x, int y)
{int i,j;
for(j=0;j<y;j++){
    for(i=0;i<x;i++){
        printf("%c",   *(*(ppMas+j)+i)   );
    }
printf("\n");
}
}

void main (void)
{
func ((int**)Mas,defY,defX);
}


Вот примерно так я планировал передовать массив, передавая в функцию указатель на массив указателей, размер по Y и по X

Как я думаю при преобразовании двумерного массива к указателю int** происходит затерание ячеек Mas[j], т.е. там появляются нулевые указатели

Как правильно здесь выкрутиться

С динамическими массивами работать не хочу
PM MAIL   Вверх
JackYF
Дата 18.4.2007, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Код

void func (int ppMas[Y][X], int x, int y)


или 

Код

void func (int ppMas[][X], int x, int y)




--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
archimed7592
Дата 18.4.2007, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(neosapient @  18.4.2007,  17:50 Найти цитируемый пост)
Как я думаю при преобразовании двумерного массива к указателю int** происходит затерание ячеек Mas[j], т.е. там появляются нулевые указатели
там нет указателей и появлятся им неоткуда!
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
PM Jabber   Вверх
HappyLife
Дата 18.4.2007, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
JackYF
Дата 18.4.2007, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(HappyLife @  18.4.2007,  18:23 Найти цитируемый пост)
Двумерный массив это массив массивов. И интерпретируеться как


Нет! 
HappyLife, юзай поиск по форуму. Не раз уже подобная тема поднималась.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Xenon
Дата 18.4.2007, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 11
Всего: 50



Код

void func(int**& arr, int height, int width)

Можешь и так - так сможешь мочить указатель smile


--------------------
user posted image  
PM MAIL   Вверх
vinter
Дата 18.4.2007, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



JackYF, в этом
Цитата(HappyLife @  18.4.2007,  18:23 Найти цитируемый пост)
Двумерный массив это массив массивов

он прав



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


Эксперт
***


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

Репутация: 11
Всего: 50



При передаче одномерного массива в фунцию в качестве фактического параметра нет разницы как мы объявили оный - int [] arr или int* arr, так как в любом случае будет неявное преобразование int [] в int*. Разница есть при передаче многомерных массивов - в случае с двумерным массивом при int arr [][X] в функцие он будет интепретироваться как (*)[X], то есть sizeof(arr[0][0] / sizeof(int)) выдаст количество элементов в строке.
Или я не понял о чем спор smile

Это сообщение отредактировал(а) Xenon - 18.4.2007, 19:21


--------------------
user posted image  
PM MAIL   Вверх
betal
Дата 18.4.2007, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(JackYF @  18.4.2007,  17:54 Найти цитируемый пост)
Выделить всёкод C++
1:
    
void func (int ppMas[Y][X], int x, int y)


или 

Выделить всёкод C++
1:
    
void func (int ppMas[][X], int x, int y)



 smile 
а в случаи если массивы находятся в Динамической памяти то
Код

void func (int **ppMas, int x, int y)


Добавлено через 1 минуту и 45 секунд
Цитата(Xenon @  18.4.2007,  19:07 Найти цитируемый пост)
Выделить всёкод C++
1:
    
void func(int**& arr, int height, int width)

Можешь и так - так сможешь мочить указатель smile 

опять не доглядел smile

Добавлено через 2 минуты и 24 секунды
Цитата(vinter @  18.4.2007,  19:13 Найти цитируемый пост)
JackYF, в этом
Цитата(HappyLife @  18.4.2007,  18:23 Найти цитируемый пост)
Двумерный массив это массив массивов

он прав

 smile 

Это сообщение отредактировал(а) betal - 18.4.2007, 21:36
--------------------
101100010100001101100001110100101111011легкие деньги
PM WWW ICQ   Вверх
archimed7592
Дата 18.4.2007, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



HappyLife, 
Цитата(HappyLife @  18.4.2007,  18:23 Найти цитируемый пост)
И Mas[1] - хранит указатель на Mas[1][0]
  Mas[2] - хранит указаьель на Mas[2][0]
согласен... "хранит"...
может быть скажешь мне тогда какой тип у этого указателя?
а лучше ничего не говори - покажи на деле:
Код
int a [10][20][30];
someType pointer = a[10];

1. какой должен быть тип someType (помимо того, что это указатель)?
2. где "хранится" этот указатель?
3. 
Код
int a [100];
int *pointer = a;// где "хранится" этот указатель?

4. 
Код
int a [10][20];
someType p1 = a[3]; // указатель, который где-то хранится
someType *pp1 = someExpression; // что нужно написать вместо someExpression, чтобы узнать адрес по которому он хранится?
someType p2 = a[7];
someType *pp2 = someExpression2;
// опа, да мы же можем творить чудеса! менять строки(или столбцы - неважно) местами!
*pp2 = p1;
*pp1 = p2;


если ещё остались вопросы, дам тебе ссылку на тему из около 20 страниц... может хоть она избавит тебя от твоих илюзий...

Добавлено через 2 минуты и 38 секунд
Цитата(betal @  18.4.2007,  21:36 Найти цитируемый пост)
а в случаи если массивы находятся в Динамической памяти то
почему вдруг ф-ция изменится, если массив будет в Динамической памяти (я так понимаю ты о 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
PM Jabber   Вверх
MAKCim
Дата 18.4.2007, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(vinter @  18.4.2007,  19:13 Найти цитируемый пост)
он прав

да не прав
двумерный массив N x M (type array[N][M]) - это одномерный массив длины N * M, и доступ к элементу (i, j) осуществляется как array + i * M + j

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


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

PM MAIL   Вверх
Anikmar
Дата 18.4.2007, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(archimed7592 @  18.4.2007,  21:53 Найти цитируемый пост)
2. где "хранится" этот указатель?

Да нигде он не хранится! Он вычисляется сразу!

Двумерный массив можно рассматривать как массив одномерных массивов. Это четко прописано в стандарте.

Уже много раз на эту тему спорили.

Код

int mas [5][10];
int *pointer;

pointer = mas[0];

pointer[5] = 999;



Это абсалютно допустимая операция, pointer указатель и получает значение адреса 1-й строчки. Этот адрес в случае статического массива нигде не хранится, а вычисляется на этапе компиляции - так как базовый адрес массива известен.

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

Код

    int **Mas;
    int Cols = 15;
    int Rows = 20;
    int i,j;

    Mas = new int*[Rows];
    for (i=0;i<Cols;i++) Mas[i] = new int[Rows];

    for (i=0;i<Cols;i++)
        for(j=0;j<Rows;j++) Mas[i][j] = RAND(100);


Все нормально компилируется и понимается как надо.
PM MAIL ICQ   Вверх
Voldemar2004
Дата 18.4.2007, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Это мы представляем двумерный массив в виде таблицы, а 3-хмерный в виде куба, а ведь это одномерный вектор памяти, так ?


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
MAKCim
Дата 18.4.2007, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Anikmar @  18.4.2007,  22:04 Найти цитируемый пост)
Этот адрес в случае статического массива нигде не хранится, а вычисляется на этапе компиляции - так как базовый адрес массива известен.

он может вычислиться только при условии, что mas находится не в стеке
в случае стека до выполнения esp неизвестен

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

в случае type array[X1][X2]...[Xn], где Xi - константы, да


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

PM MAIL   Вверх
Xenon
Дата 18.4.2007, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 11
Всего: 50



Просто важно не забывать, что в случае с динамическими массивами - это просто кучка разбросанных по памяти массивов.


--------------------
user posted image  
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0624 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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