Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
#1

Какими способами можно передать многомерные массивы в функцию? - C++

18.02.2010, 01:34. Просмотров 1410. Ответов 20
Метки нет (Все метки)

Возник вопрос, какими способами можно передать многомерные массивы в функцию???
Если не сложно, приведите парочку примеров
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.02.2010, 01:34     Какими способами можно передать многомерные массивы в функцию?
Посмотрите здесь:

Передача массивов в функцию (многомерные массивы) - C++
Вычислить с использованием функции max элементы каждой строки матрицы A(10,20). Результаты формировать в одномерных массивах C(10) и D(10)....

Передача массивов в функцию (многомерные массивы) - C++
Напишите программу на С++: 5.3 Передача массивов в функцию (многомерные массивы) Написать программу, выполняющую действия в...

Многомерные массивы. Написать функцию построения по действительными числами квадратной матрицы - C++
1) Написать функцию построения по действительными числами a1, a2, ..., an (n <= 50) такой квадратной матрици . Спасибо С ++

В разработанную пользовательскую функцию параметр-массив передать двумя способами: - C++
Как переделать код, чтоб соответствовало заданию: В разработанную пользовательскую функцию параметр-массив передать двумя способами: ...

Какими из приведенных способов можно задавать функцию main - C++
1. void main(int argc, char* argv) 2. void main () 3. char* main ( int input ) 4. int main ( char argc, int* argv ) 5. int...

В функцию с переменным, числом параметров передать массивы целых чисел - C++
#include <iostream> void main() { void func(int k, ...); int x = { 15, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, ...

Можно ли передать в функцию указатель на перегруженный оператор? - C++
Снова здравствуйте) Можно ли передать в функцию указатель на перегруженный оператор и как? Что-то типа: class f { ... ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
M128K145
Эксперт С++
8283 / 3502 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
18.02.2010, 02:40     Какими способами можно передать многомерные массивы в функцию? #2
C++
1
2
3
void func(int** mas, int n, int m)
{
}
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
18.02.2010, 15:40  [ТС]     Какими способами можно передать многомерные массивы в функцию? #3
а как эту функцию вызвать???
Genius Ignat
1235 / 773 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
18.02.2010, 16:38     Какими способами можно передать многомерные массивы в функцию? #4
func(имя твоего массива: массив динамический, размер1[высота], размер2[ширина]); //так.
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
18.02.2010, 16:42  [ТС]     Какими способами можно передать многомерные массивы в функцию? #5
значит в этом вся проблема, как быть с не динамическими массивами???
Genius Ignat
1235 / 773 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
18.02.2010, 16:57     Какими способами можно передать многомерные массивы в функцию? #6
Так:
C++
1
2
3
void func(int* mas, int n, int m)
{
}
Такую функцию можно вызвать допустим так:
C++
1
 func(&matrix[0][0],3,3);
Зоти Сергей
228 / 226 / 13
Регистрация: 18.12.2009
Сообщений: 316
18.02.2010, 17:23     Какими способами можно передать многомерные массивы в функцию? #7
Цитата Сообщение от M128K145 Посмотреть сообщение
void func(int** mas, int n, int m)
Вообще-то это передача в функцию указателя на указатель а не двумерного массива.
При использовании как двумерного массива в реализации можете получить Access Violation.

!функция из данной программы
Genius Ignat
1235 / 773 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
18.02.2010, 17:29     Какими способами можно передать многомерные массивы в функцию? #8
Зоти Сергей:

C++
1
2
3
4
5
6
7
8
9
int main(){
int **matrix = new int*[2];
for(int i=0;i<2;i++)matrix[i] = new int[2];
func(matrix,2,2);    //вот так передается двумерный динамический массив.
 
 
//тыдыщ дпз удаление ниже должно быть ...
return 0;
}
Добавлено через 52 секунды
указателя на указатель хранит начало двумерного массива: адрес первого указателя.

Добавлено через 29 секунд
указателя на указатель хранит начало двумерного массива: адрес первого указателя.
Зоти Сергей
228 / 226 / 13
Регистрация: 18.12.2009
Сообщений: 316
19.02.2010, 14:45     Какими способами можно передать многомерные массивы в функцию? #9
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Добавлено через 52 секунды
указателя на указатель хранит начало двумерного массива: адрес первого указателя.
Добавлено через 29 секунд
указателя на указатель хранит начало двумерного массива: адрес первого указателя.

Да, это правильно. так вы в функцию и передаете указатель на указатель.
А попробуйте в Вашу ф-цию func(**int)
передать статический массив.
например

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        int Width=10;
        int Height=10;
        int ** Array = new int * [Width];
        for(int i=0;i<Width;i++)
        Array[i]= new int[Height];
        for(int y=0;y<Height;y++)
                for(int x=0;x<Width;x++)
                        Array[x][y]=x+y;
 
        func(Array,Height,Width);       //ошибки не выдаст.
 
        
 
        int SecondArray[10][10];
         for(int y=0;y<Height;y++)
                for(int x=0;x<Width;x++)
                        SecondArray[x][y]=x+y;
 
        
         func((int**)&Array[0][0],Height,Width); //А вот это ошибка хотя передаете массив
Genius Ignat
1235 / 773 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
20.02.2010, 13:36     Какими способами можно передать многомерные массивы в функцию? #10
Зоти Сергей:
А ты думал я этого не знаю, я уже приводил как статический можно передать:
Так:
C++
1
2
3
void func(int* mas, int n, int m)
{
}
Такую функцию можно вызвать допустим так:
C++
1
func(&matrix[0][0],3,3);
spacistor
1 / 1 / 0
Регистрация: 18.02.2010
Сообщений: 4
20.02.2010, 14:16     Какими способами можно передать многомерные массивы в функцию? #11
Genius Ignat,
Вызвать-то можно, а как внутри функции обратиться к элементу матрицы maytrix[i][j] ?
Genius Ignat
1235 / 773 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
20.02.2010, 14:24     Какими способами можно передать многомерные массивы в функцию? #12
C++
1
2
3
4
5
6
int print(int *matrix, int Height, int Width){
int i=0,j=1;
matrix[i*Width+j];          //понятно.
 
return 0;
}
Добавлено через 6 минут
matrix[i][j]; //так мой компилятор не разрешает.
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
20.02.2010, 14:36     Какими способами можно передать многомерные массивы в функцию? #13
Цитата Сообщение от Genius Ignat Посмотреть сообщение
matrix[i][j]; //так мой компилятор не разрешает.
Еще бы, было бы весьма странно если компилятор разрешал двойную индексацию одномерного массива.
spacistor
1 / 1 / 0
Регистрация: 18.02.2010
Сообщений: 4
20.02.2010, 16:02     Какими способами можно передать многомерные массивы в функцию? #14
Genius Ignat,
гм.. а ты проверял, это работает? В смысле понятно что компилируется, но выдаются ли верные данные из таблицы (именно элементы стоящие в положении (i,j))?
Genius Ignat
1235 / 773 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
20.02.2010, 18:09     Какими способами можно передать многомерные массивы в функцию? #15
Еще бы, было бы весьма странно если компилятор разрешал двойную индексацию одномерного массива.

C++
1
2
3
4
5
6
tepmlate<class T>
long fun(T*matr,int H,int W){
int i=0,j=1;
matr[i][j]; //а так разрешает.
return 0;
}
CyBOSSeR: Объясни пожалуйста это.

spacistor:
Всё правильно работает можешь не сомневаться.

Добавлено через 1 час 56 минут
tepmlate - ошибся не множко в названии, сорь, ну суть вопроса не меняется.

Добавлено через 3 минуты
Скорее всего это связано с шаблонами.

Добавлено через 24 секунды
А как именно не догадываюсь.
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
20.02.2010, 18:09     Какими способами можно передать многомерные массивы в функцию? #16
Цитата Сообщение от Genius Ignat Посмотреть сообщение
CyBOSSeR: Объясни пожалуйста это.
Если тип параметра шаблона поддерживает операцию индексной адресации, то данный код корректен.
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Всё правильно работает можешь не сомневаться.
Вот в этом я сильно сомневаюсь. Продемонстрируй вывод матрицы на консоль с помощью представленного тобой способа.
Genius Ignat
1235 / 773 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
20.02.2010, 18:15     Какими способами можно передать многомерные массивы в функцию? #17
Сообщение было отмечено автором темы, экспертом или модератором как ответ
зря сомневался CyBOSSeR: всё работает.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream.h>
int print(int *matrix, int Height, int Width){
    for(int i=0;i<Height;i++){
        for(int j=0;j<Width;j++){
cout<<' '<<matrix[i*Width+j];
        }
cout<<'\n';
    }
 
return 0;
}
 
int main(){
    int matrix[3][3]= {
 
        {1,2,3},
        {4,5,6},
        {7,8,9}
 
    };
 
print(&matrix[0][0],3,3);
 
return 0;
 
}
Добавлено через 28 секунд
VC++ 6.0
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
20.02.2010, 18:23     Какими способами можно передать многомерные массивы в функцию? #18
Genius Ignat, а теперь попробуй использовать эту функцию для вывода динамической матрицы и посмотри результат.

Рассмотрим матрицу:
1 2 3
4 5 6
7 8 9


Дело в том что твой подход работает только для матриц, строки которых последовательно друг за другом располагаются в памяти, т.е.
1 2 3 4 5 6 7 8 9

Если же распределять память под матрицу в куче, то картина будет совсем другой - строки скорее всего будут разбросаны в куче.
Genius Ignat
1235 / 773 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
20.02.2010, 18:41     Какими способами можно передать многомерные массивы в функцию? #19
У меня и так работает.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream.h>
#include <stdlib.h>
 
int print(int *matrix, int Height, int Width){
        for(int i=0;i<Height;i++){
                for(int j=0;j<Width;j++){
cout<<' '<<matrix[i*Width+j];
                }
cout<<'\n';
        }
 
return 0;
}
 
int main(){
   int *matrix = (int *)malloc(3*3*sizeof(int));
 
matrix[0*3+0] = 1;
matrix[0*3+1] = 2;
matrix[0*3+2] = 3;
 
matrix[1*3+0] = 4;
matrix[1*3+1] = 5;
matrix[1*3+2] = 6;
 
matrix[2*3+0] = 7;
matrix[2*3+1] = 8;
matrix[2*3+2] = 9;
 
 
   print(matrix,3,3);
   free(matrix);
return 0;
 
}
В учебнике который у меня есть, так же с Д Матрицами работают, и кому теперь верить.

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

Добавлено через 37 секунд
Ну про то что работает мне врать не резон.

Добавлено через 2 минуты
Если ты прав:
будут разбросаны в куче?
Какое решение предложишь, мне тоже надо знать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.02.2010, 22:09     Какими способами можно передать многомерные массивы в функцию?
Еще ссылки по теме:

Можно ли передать в функцию массив произвольного размера ? - C++
Хочу создать функцию для детекта количества элементов в массиве sizeof(array)/sizeof(array); и надо чтобы функция принимала...

Можно ли в качестве параметра функции передать другую функцию? - C++
В ниже представленной программе функция returnMax находит в массиве максимальный элемент и возвращает его. returnMin - делает тоже самое,...

А можно в функцию, или перегруженный оператор передать ссылку на копию? - C++
И какой надо написать прототип?

Можно ли передать указатель на функцию как параметр другой функции? - C++
В общем, вопрос. Можно ли, допустим ... int fun1(int x) { ... ... ... return x*1000; }

Многомерные массивы - C++
Здравствуйте, уважаемые форумчане! Давненько я не задавал здесь своих глупых вопросов по плюсам. Надо бы исправить ситуацию: В общем, я...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
20.02.2010, 22:09     Какими способами можно передать многомерные массивы в функцию? #20
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ну как вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
 
template<class T>
void ShowMatrix(T matrix, int n, int m)
{
  for(int i = 0; i < n; ++i){
    for(int j = 0; j < m; ++j)
      std::cout << matrix[i][j] << "\t";
 
    std::cout << std::endl;
  }
}
 
int main()
{
  int matrix[][3] = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9},
  };
 
  ShowMatrix(matrix, 3, 3);
 
  return 0;
}
Цитата Сообщение от Genius Ignat Посмотреть сообщение
У меня и так работает.
Естественно, здесь и матрицы то нет, а только одномерный массив, поэтому и работает.
Yandex
Объявления
20.02.2010, 22:09     Какими способами можно передать многомерные массивы в функцию?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru