С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/120: Рейтинг темы: голосов - 120, средняя оценка - 4.53
1 / 1 / 1
Регистрация: 20.01.2013
Сообщений: 80
1

Передача по ссылке двумерного динамического массива в функцию

24.12.2015, 05:01. Показов 21937. Ответов 114
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приведите, пожалуйста, пример. Нигде не могу найти.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.12.2015, 05:01
Ответы с готовыми решениями:

Передача двумерного массива в функцию по ссылке
Требуется написать функцию, которая выделяет память для одномерного и двумерного динамического...

Передача динамического двумерного массива в функцию
Я сделал вот так: void PrintMatrix(int** matrix, int& n, int& m) { for (int i = 0; i < n;...

Передача двумерного динамического массива в функцию
Как можно передать динамическую матрицу в функцию что бы при выходе из функции она оставила прежние...

Передача двумерного динамического массива чисел в функцию
void Map::setCell(int** block, Room* room, int type){ for(int i=room->x; i<room->w; ++i)...

114
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
24.12.2015, 05:19 2
C++
1
void f(int**& arr, int n, int m);
0
Неэпический
18109 / 10696 / 2062
Регистрация: 27.09.2012
Сообщений: 26,939
Записей в блоге: 1
24.12.2015, 05:25 3
Лучший ответ Сообщение было отмечено Ilot как решение

Решение

nord_v, это ссылка на указатель на указатель, а не ссылка на массив.

Добавлено через 4 минуты
C++
1
2
3
4
5
template<typename T, size_t N, size_t M>
void foo(T (&arr)[N][M])
{
   std::cout << N << ":" << M << std::endl ;
}
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
24.12.2015, 05:26 4
Цитата Сообщение от Croessmah Посмотреть сообщение
это ссылка на указатель на указатель, а не ссылка на массив.
А ничего, что вопрос про динамически создаваемый массив?
0
Неэпический
18109 / 10696 / 2062
Регистрация: 27.09.2012
Сообщений: 26,939
Записей в блоге: 1
24.12.2015, 05:26 5
nord_v, динамически создаваемый значит созданный в динамике. Это не значит, что от этого массив перестает быть массивом.
0
Эксперт С++
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
24.12.2015, 05:32 6
Цитата Сообщение от Croessmah Посмотреть сообщение
динамически создаваемый значит созданный в динамике. Это не значит, что от этого массив перестает быть массивом.
первый вариант ответа был более верным.
но оба они бесполезны для тс
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
24.12.2015, 05:32 7
Цитата Сообщение от Croessmah Посмотреть сообщение
динамически создаваемый значит созданный в динамике. Это не значит, что от этого массив перестает быть массивом.
В динамике, т.е., в динамической памяти. Пример приведи создания такого, и чтобы твой шаблон работал. Некоторые, и массивом такие массивы не называют (якобы, массив должен быть расположен непрерывно в памяти).
0
1 / 1 / 1
Регистрация: 20.01.2013
Сообщений: 80
24.12.2015, 05:33  [ТС] 8
Насколько я понял template - это класс, да? Если да, то можно без класса Я пока не дошел до них.
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
24.12.2015, 05:37 9
Цитата Сообщение от hoggy Посмотреть сообщение
но оба они бесполезны для тс
Почему?

Добавлено через 1 минуту
Цитата Сообщение от Vahram1995 Посмотреть сообщение
Насколько я понял template - это класс, да?
Там вообще не динамически создаваемый массив. Тебе для чего нужно? Код есть какой-то?
0
Эксперт С++
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
24.12.2015, 05:37 10
Цитата Сообщение от nord_v Посмотреть сообщение
Почему?
я имел ввиду два ответа от господина Croessmah
сейчас видно только второй
0
1 / 1 / 1
Регистрация: 20.01.2013
Сообщений: 80
24.12.2015, 05:45  [ТС] 11
Код есть, но передача не по ссылке(+там ошибка есть)
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#include <iostream>
#include <stdlib.h>
using namespace std;
 
void repl(int* A,int* B)
{  cout << endl << "A=" << A << "    *A=" << *A << endl;
   cout << "B=" << B << "   *B=" << *B << endl;
   int C;
    C=*A;
   *A=*B;
   *B=C;
    cout << endl << "A=" << A << "    *A=" << *A << endl;
     cout << "B=" << B << "   *B=" << *B << endl;
}
 
int main()
{
    int i, j, onem, onen, twom, twon, maxone, maxtwo;
    int *addressone, *addresstwo;
 
    //First dynamic massiv
    cout << "Massivone->kolichestvo strok = ";
    cin >> onem;
    cout << "Massivone->kolichestvo stolbec = ";
    cin >> onen;
    cout << endl;
 
    int** massivone=new int*[onem];
    for(i=0; i<onem; i++)
    massivone[i]=new int[onen];
 
    for(i=0; i<onem; i++)
    {
        for(j=0; j<onen; j++)
        {
            massivone[i][j]=rand()%100;
            cout << massivone[i][j] << " ";
        }
        cout << endl;
    }
    cout << endl << endl;
 
       //Second dynamic massiv
            cout << "Massivtwo->kolichestvo stroka = ";
            cin >> twom;
            cout << "Massivtwo->kolichestvo stolbec = ";
            cin >> twon;
            cout << endl;
 
            int** massivtwo=new int*[twom];
            for(i=0; i<twom; i++)
            massivtwo[i]=new int[twon];
 
            for(i=0; i<twom; i++)
            {
                for(j=0; j<twon; j++)
                {
                    massivtwo[i][j]=rand()%100;
                    cout << massivtwo[i][j] << " ";
                }
                cout << endl;
            }
            cout << endl << endl;
 
 
            //Maximum number from first massiv
            maxone=massivone[0][0];
            for(i=0; i<onem; i++)
            {
                for(j=0; j<onen; j++)
                {
                    if(maxone<massivone[i][j])
                    {
                       maxone=massivone[i][j];
                       addressone=&(massivone[i][j]);
                    }
                    else
                    addressone=&(massivone[0][0]);
 
                }
            }cout << "Max first massiv = " << maxone << endl;
            cout << addressone << "    " << &massivone[0][0] << "   " << massivone << endl;
 
            //Maximum number from second massiv
            maxtwo=massivtwo[0][0];
            for(i=0; i<twom; i++)
            {
                for(j=0; j<twon; j++)
                {
                    if(maxtwo<massivtwo[i][j])
                      {
                        maxtwo=massivtwo[i][j];
                        addresstwo=&(massivtwo[i][j]);
                      }
                    else addresstwo=&(massivtwo[0][0]);
                }
            }cout << "Max second massiv = " << maxtwo << endl;
            cout << addresstwo << "    " << &massivtwo[0][0] << "   " << massivtwo << endl;
 
            cout << endl << endl;
            repl (addressone, addresstwo);
 
 
            for(i=0; i<onem; i++)
            {
                for(j=0; j<onen; j++)
                {
                    cout << massivone[i][j] << " ";
                }
                cout << endl;
            }
            cout << endl << endl;
 
 
            for(i=0; i<twom; i++)
            {
                for(j=0; j<twon; j++)
                {
                    cout << massivtwo[i][j] << " ";
                }
                cout << endl;
            }
            cout << endl << endl;
 
 
            for(i=0; i<onem; i++)
                delete[]massivone[i];
            delete[]massivone;
 
 
            for(i=0; i<twom; i++)
                delete[]massivtwo[i];
            delete[]massivtwo;
 
    system("pause");
    return 0;
}
Добавлено через 2 минуты
И передает не массив...
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
24.12.2015, 05:49 12
Цитата Сообщение от Vahram1995 Посмотреть сообщение
И передает не массив...
С этим сам разбирайся. Тут непонятно о чём.
0
1 / 1 / 1
Регистрация: 20.01.2013
Сообщений: 80
24.12.2015, 05:54  [ТС] 13
Цитата Сообщение от nord_v Посмотреть сообщение
С этим сам разбирайся. Тут непонятно о чём.
Я и не говорю Вам разбираться. Я просто пример хочу увидеть где через main динамический массив передается по ссылке в другую функцию.
0
338 / 67 / 37
Регистрация: 22.12.2010
Сообщений: 138
24.12.2015, 06:41 14
вот так, к примеру?
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
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <cstdlib>
#include <time.h>
 
using std::cout;
using std::cin;
using std::endl;
 
int calc(int**& myarr, int m, int n) {
    int summ = 0;
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            summ = summ + myarr[i][j];
        }
    }
    return summ;
}
 
void free(int**& myarr, int m, int n) {
    for (int i = 0; i < m; i++) {
        delete []myarr[i];
    }
    delete []myarr;
}
 
int main() {
    setlocale(LC_ALL,"Russian");
    srand(time(NULL));
    int m,n;
    cout << "кол-во строк = ";
    cin >> m;
    cout << "кол-во столбцов = ";
    cin >> n;
    int **myarr = new int *[m];
    for (int i = 0; i < m; i++) {
        myarr[i] = new int[n];
    }
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            myarr[i][j] = rand()%3 + 1;
            cout << myarr[i][j] << ' ';
        }
        cout << "\n";
    }
    cout << "Сумма элементов массива = " << calc(myarr,m,n);
    free(myarr,m,n);
    return 0;
}
1
Неэпический
18109 / 10696 / 2062
Регистрация: 27.09.2012
Сообщений: 26,939
Записей в блоге: 1
24.12.2015, 07:31 15
hoggy, ну да, врядли ему нужна ссылка именно на массив
Кстати, нужно будет поэксперементировать с динамическим выделением многомерного массива. Как известно, указатель же будет уже n-1 измерений, соответственно просто так не прокатит выделить и присвоить указателю, не сократив "размерность" в последнем. Хотя может я что-то и путаю. Доберусь до компа, попробую.
0
Эксперт С++
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
24.12.2015, 08:09 16
Цитата Сообщение от Croessmah Посмотреть сообщение
врядли ему нужна ссылка именно на массив
о тс можно не переживать.
его дело все равно безнадежно.

Цитата Сообщение от Croessmah Посмотреть сообщение
нужно будет поэксперементировать с динамическим выделением многомерного массива. Как известно, указатель же будет уже n-1 измерений, соответственно просто так не прокатит выделить и присвоить указателю, не сократив "размерность" в последнем.
у вас вообще не получится выделить многомерный массив динамически.

если для одномерного есть синтаксический сахар,
который и создает иллюзию динамического в неокрепших умах,
то для многомерного его уже нет:

C++
1
2
3
int v=1;
new int[v][v]; // error: array size in new-expression must be constant
    // агриццо на вторую размерность.
соответственно, результат получаем:

C++
1
2
int v=1;
int (*p)[1] = new int[v][1]; // <--- динамика идет лесом
я думаю, что для многомерных массивов сахарок не завезли,
просто потому, что он нафиг не нужен.

потому что в динамике уже не принципиально:
это одномерный на 4, или двух мерный 2 на 2
разницы абсолютно никакой.
0
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
24.12.2015, 09:03 17
C++
1
2
3
4
5
6
#include <vector>
 
typedef vector<Any_type> Any_Type_vector;
typedef vector<Any_Type_vector> S_vector;
 
S_vector& dynamic_array; //dynamic_array - это ссылка на динамический двумерный массив
так ведь?
0
Неэпический
18109 / 10696 / 2062
Регистрация: 27.09.2012
Сообщений: 26,939
Записей в блоге: 1
24.12.2015, 09:08 18
Цитата Сообщение от hoggy Посмотреть сообщение
C++
1
int (*p)[1] = new int[v][1]; // <--- динамика идет лесом
под словом динамический я имею ввиду массив с dynamic storage duration, а не "расширяемый".
Цитата Сообщение от hoggy Посмотреть сообщение
у вас вообще не получится выделить многомерный массив динамически.
Я имел ввиду:
C++
1
2
3
4
5
6
7
8
9
10
11
12
template<typename T, size_t N, size_t M>
void foo(const T (&arr)[N][M])
{
    //...
}
 
 
int main()
{
    int (*p1)[5][3] = (int(*)[5][3])new int[5][3] ;
    foo(*p1) ;
}
0
Эксперт С++
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
24.12.2015, 09:25 19
Цитата Сообщение от Croessmah Посмотреть сообщение
под словом динамический я имею ввиду массив с dynamic storage duration, а не "расширяемый".
ну просто приходит понимание,
зачем же все таки нужны указатели "на сам массив",
а не на его первый элемент)
0
Неэпический
18109 / 10696 / 2062
Регистрация: 27.09.2012
Сообщений: 26,939
Записей в блоге: 1
24.12.2015, 09:27 20
Цитата Сообщение от hoggy Посмотреть сообщение
ну просто приходит понимание
я помню, как бился над вопросом нахрена вообще нужны указатели
0
24.12.2015, 09:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.12.2015, 09:27
Помогаю со студенческими работами здесь

Передача двумерного динамического массива в функцию(объяснение)
Когда мы хотим передать двумерный динамический массив в функцию через указатели (**a) , то в теле...

Передача двумерного динамического массива в функцию в качестве параметра
Вообщем надо сложить и умножить две матрицы, но сделать это в отдельных функциях. Матрицы заданы...

Передача двумерного динамического массива в функцию построчно и сортировка
Всем доброго времени суток! Собственно сабж: есть двумерный динамический массив, который надо...

Передача динамического двумерного массива в процедуру
Написал вот такой код для одномерного динамического массива #include &lt;iostream&gt; #include...


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

Или воспользуйтесь поиском по форуму:
20
Закрытая тема Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru