Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
FFPowerMan
346 / 239 / 103
Регистрация: 11.10.2018
Сообщений: 1,626
1

Как передать в функцию указатель на двухмерный массив?

14.03.2019, 19:20. Просмотров 236. Ответов 11

Здравствуйте. Как передать в функцию указатель на двухмерный массив?
Код компилируется, но дебаггер показал что в функции двухмерный динамический массив типа float создается. но он не выходит наружу. Что сделать что-бы он все-таки вышел наружу?
Вся моя программа:
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>
using namespace std;
 
//Глобальные переменные
float **Q;
 
//=================Функции=================
void CreateArray(float **U, int Str, int Stl)
{
    int B;
 
    //Sozdaem massiv
    U = new float*[Str];
    for(B = 0; B < Str; B++)
        U[B] = new float[Stl];
}
 
 
void DeleteArray(float **X, int Strok, int Stlolbcov)
{
    int z;
 
    //Udalenie
    for(z = 0; z < Strok; z++)
       delete[] X[z];
    delete[] X;
}
 
 
int main()
{
    int N, M;
  
    cout << "Vvedite razmeri massiva: N i M:\n";
    cout << "N = ";
    cin >> N;
    cout << "\nM = ";
    cin >> M;
    cout << "\n";
 
    CreateArray(Q, N, M);
    
    DeleteArray((float**)Q, N, M);
 
    system("pause");
    return 0;
}
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.03.2019, 19:20
Ответы с готовыми решениями:

Как передать двухмерный массив в функцию?
Подскажите пожалуйста, как в функцию передать двухмерный массив? Пробовал так: void FuncArr(int**...

Как передать двухмерный массив в функцию по ссылке?
Преподаватель в универе просит написать функцию вида void st3(&amp;array, &amp;n, &amp;m). Бьюсь головой об...

Как в функцию передать параметр - двухмерный массив
void max_el() { int i,j,max; for ( i=1 ; i&lt;=n; i++) for ( j=1; j&lt;=m; j++) ...

Как передать в функцию двухмерный динамический массив по ссылке?
как передать в функцию двухмерный динамический массив по ссылке?

Как передать в функцию указатель на двумерный массив?
Есть массив int arr, как передать в функцию указатель на него, чтобы при изменения массива в...

11
Azazel-San
Mental handicap
1175 / 561 / 158
Регистрация: 24.11.2015
Сообщений: 2,271
Завершенные тесты: 1
14.03.2019, 19:27 2
Цитата Сообщение от FFPowerMan Посмотреть сообщение
но он не выходит наружу. Что сделать что-бы он все-таки вышел наружу?
Поподробнее можно?
0
zayats80888
2131 / 1248 / 523
Регистрация: 07.02.2019
Сообщений: 3,379
14.03.2019, 19:29 3
передать по ссылке

Добавлено через 1 минуту
new присваивает новое значение указателю, а вы передаете его копированием
0
nd2
3103 / 2597 / 1134
Регистрация: 29.01.2016
Сообщений: 8,690
14.03.2019, 19:31 4
Цитата Сообщение от FFPowerMan Посмотреть сообщение
Что сделать что-бы он все-таки вышел наружу?
C++
1
void CreateArray(float **&U, int Str, int Stl)
2
14.03.2019, 19:31
FFPowerMan
346 / 239 / 103
Регистрация: 11.10.2018
Сообщений: 1,626
14.03.2019, 19:35  [ТС] 5
Azazel-San, завел я указатель на глобальный массив:
C++
1
float **Q;
И хочу создать его в функции. Как мне это сделать?
Сейчас функция CreateArray не выводит указатель на созданный внутри динамический массив U. Когда программа выходит из функции CreateArray, то в Q находится просто 0.

Zayats80888, я пробовал по ссылке, но компилятор ругается - что-то ничего не выходит. Может написать готовый код?
0
zayats80888
2131 / 1248 / 523
Регистрация: 07.02.2019
Сообщений: 3,379
14.03.2019, 19:37 6
Цитата Сообщение от FFPowerMan Посмотреть сообщение
Zayats80888, я пробовал по ссылке, но компилятор ругается - что-то ничего не выходит. Может написать готовый код?
может & не туда прилепили?
0
Azazel-San
Mental handicap
1175 / 561 / 158
Регистрация: 24.11.2015
Сообщений: 2,271
Завершенные тесты: 1
14.03.2019, 19:39 7
Цитата Сообщение от FFPowerMan Посмотреть сообщение
Может написать готовый код?
C++
1
2
3
4
5
6
7
8
void f(int**& arr, std::size_t const size) {
    arr = new int*[size]{};
}
 
int main() {
    int** arr;
    f(arr, 5);
}
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
8002 / 3891 / 538
Регистрация: 04.12.2011
Сообщений: 11,373
Записей в блоге: 9
14.03.2019, 19:39 8
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
#include <iostream>
#include <cstdlib>
using namespace std;
 
 
 
//=================Функции=================
typedef float ** PointerToPointerToFloat;
 
void CreateArray(PointerToPointerToFloat & U, int Str, int Stl)
{ 
 
    //Sozdaem massiv
    U = new float*[Str];
    for(int B = 0; B < Str; B++)
        U[B] = new float[Stl];
}
 void InitArray(PointerToPointerToFloat & U, int Str, int Stl)
{ 
 
   for(int i = 0; i < Str; ++i)
{
    for(int j = 0; j < Stl; ++j)
    {
        U[i][j]=i+j;
    }
    
}
   
}
 
void DeleteArray(float **X, int Strok, int Stlolbcov)
{
    int z;
 
    //Udalenie
    for(z = 0; z < Strok; z++)
       delete[] X[z];
    delete[] X;
}
void printFloatArray(PointerToPointerToFloat & U, int Str, int Stl)
{
for(int i = 0; i < Str; ++i)
{
    for(int j = 0; j < Stl; ++j)
    {
        cout<<U[i][j]<<' ';
    }
    cout<<endl;
}
}
 
int main()
{
    int N, M;
  
    cout << "Vvedite razmeri massiva: N i M:\n";
    cout << "N = ";
    cin >> N;
    cout << "\nM = ";
    cin >> M;
    cout << "\n";
    //не Глобальные переменные
float **Q;
 
    CreateArray(Q, N, M);
    InitArray(Q, N, M);
     printFloatArray(Q, N, M);
 
    
    DeleteArray((float**)Q, N, M);
 
    system("pause");
    return 0;
}
0
FFPowerMan
346 / 239 / 103
Регистрация: 11.10.2018
Сообщений: 1,626
14.03.2019, 19:40  [ТС] 9
Цитата Сообщение от nd2 Посмотреть сообщение
C++
1
**&U
- Ооооо, спасибо, сейчас заработало. А как это правильно называется? Ссылка на указатель второго уровня?

Добавлено через 1 минуту
Цитата Сообщение от zayats80888 Посмотреть сообщение
может & не туда прилепили?
- да, не туда, сначала написал, вот так:
C++
1
float &**U,
0
nd2
3103 / 2597 / 1134
Регистрация: 29.01.2016
Сообщений: 8,690
14.03.2019, 19:45 10
Цитата Сообщение от FFPowerMan Посмотреть сообщение
А как это правильно называется? Ссылка на указатель второго уровня?
Ссылка на указатель на указатель.
0
FFPowerMan
346 / 239 / 103
Регистрация: 11.10.2018
Сообщений: 1,626
15.03.2019, 06:44  [ТС] 11
Так а почему здесь нельзя решить просто с указателями? Т.е. почему вот этот код не работает?
C++
1
void CreateArray(float **U, int Str, int Stl)
0
Новичок
Модератор
1578 / 1037 / 479
Регистрация: 17.07.2012
Сообщений: 5,209
Завершенные тесты: 3
15.03.2019, 07:07 12
Уже ж написали. Потому что указатель на указатель передается по значению т.е создается копия указателя и в функции меняется эта копия, а оригинальный указатель остается неизменным. Потому нужно передавать по ссылке.
0
15.03.2019, 07:07
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.03.2019, 07:07

Как правильно передать в функцию указатель на двумерный массив?
Сабж #include &lt;windows.h&gt; #include &lt;stdio.h&gt; using namespace std; //ОТ безысходности сделал...

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

Передать двухмерный массив в функцию
Допустим, у меня есть двухмерный массив символов char level = { &quot; &quot;, &quot; ...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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