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

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

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

Студворк — интернет-сервис помощи студентам
Приведите, пожалуйста, пример. Нигде не могу найти.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.12.2015, 05:01
Ответы с готовыми решениями:

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

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

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

114
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
24.12.2015, 05:19
C++
1
void f(int**& arr, int n, int m);
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
24.12.2015, 05:25
Лучший ответ Сообщение было отмечено 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
Цитата Сообщение от Croessmah Посмотреть сообщение
это ссылка на указатель на указатель, а не ссылка на массив.
А ничего, что вопрос про динамически создаваемый массив?
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
24.12.2015, 05:26
nord_v, динамически создаваемый значит созданный в динамике. Это не значит, что от этого массив перестает быть массивом.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
24.12.2015, 05:32
Цитата Сообщение от Croessmah Посмотреть сообщение
динамически создаваемый значит созданный в динамике. Это не значит, что от этого массив перестает быть массивом.
первый вариант ответа был более верным.
но оба они бесполезны для тс
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
24.12.2015, 05:32
Цитата Сообщение от Croessmah Посмотреть сообщение
динамически создаваемый значит созданный в динамике. Это не значит, что от этого массив перестает быть массивом.
В динамике, т.е., в динамической памяти. Пример приведи создания такого, и чтобы твой шаблон работал. Некоторые, и массивом такие массивы не называют (якобы, массив должен быть расположен непрерывно в памяти).
0
 Аватар для Vahram1995
1 / 1 / 1
Регистрация: 20.01.2013
Сообщений: 80
24.12.2015, 05:33  [ТС]
Насколько я понял template - это класс, да? Если да, то можно без класса Я пока не дошел до них.
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
24.12.2015, 05:37
Цитата Сообщение от hoggy Посмотреть сообщение
но оба они бесполезны для тс
Почему?

Добавлено через 1 минуту
Цитата Сообщение от Vahram1995 Посмотреть сообщение
Насколько я понял template - это класс, да?
Там вообще не динамически создаваемый массив. Тебе для чего нужно? Код есть какой-то?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
24.12.2015, 05:37
Цитата Сообщение от nord_v Посмотреть сообщение
Почему?
я имел ввиду два ответа от господина Croessmah
сейчас видно только второй
0
 Аватар для Vahram1995
1 / 1 / 1
Регистрация: 20.01.2013
Сообщений: 80
24.12.2015, 05:45  [ТС]
Код есть, но передача не по ссылке(+там ошибка есть)
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
Цитата Сообщение от Vahram1995 Посмотреть сообщение
И передает не массив...
С этим сам разбирайся. Тут непонятно о чём.
0
 Аватар для Vahram1995
1 / 1 / 1
Регистрация: 20.01.2013
Сообщений: 80
24.12.2015, 05:54  [ТС]
Цитата Сообщение от nord_v Посмотреть сообщение
С этим сам разбирайся. Тут непонятно о чём.
Я и не говорю Вам разбираться. Я просто пример хочу увидеть где через main динамический массив передается по ссылке в другую функцию.
0
338 / 67 / 37
Регистрация: 22.12.2010
Сообщений: 138
24.12.2015, 06:41
вот так, к примеру?
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
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
24.12.2015, 07:31
hoggy, ну да, врядли ему нужна ссылка именно на массив
Кстати, нужно будет поэксперементировать с динамическим выделением многомерного массива. Как известно, указатель же будет уже n-1 измерений, соответственно просто так не прокатит выделить и присвоить указателю, не сократив "размерность" в последнем. Хотя может я что-то и путаю. Доберусь до компа, попробую.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
24.12.2015, 08:09
Цитата Сообщение от 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
 Аватар для SergioO
261 / 209 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
24.12.2015, 09:03
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
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
24.12.2015, 09:08
Цитата Сообщение от 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
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
24.12.2015, 09:25
Цитата Сообщение от Croessmah Посмотреть сообщение
под словом динамический я имею ввиду массив с dynamic storage duration, а не "расширяемый".
ну просто приходит понимание,
зачем же все таки нужны указатели "на сам массив",
а не на его первый элемент)
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
24.12.2015, 09:27
Цитата Сообщение от hoggy Посмотреть сообщение
ну просто приходит понимание
я помню, как бился над вопросом нахрена вообще нужны указатели
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.12.2015, 09:27
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Закрытая тема Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru