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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 5.00
devdemobuster
Сообщений: n/a
19.02.2013, 20:13     Передача двумерного массива в функцию по ссылке #1
Требуется написать функцию, которая выделяет память для одномерного и двумерного динамического массива. Для первого варианта вопросов вроде бы нет. Не получается сделать для двумерного.
Помогите поправить программу

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
#include <iostream>
#include <iomanip>
using namespace std;
 
inline void init (double &arr, int arr_len);
inline void init (double &arr_A, int arr_len1, int arr_len2);
 
void main ()
{
    setlocale(0, "");
 
    double *(*A) = NULL, *(*E) = NULL, *B = NULL, *X = NULL; 
    int M, N;
 
    cin >> M >> N;  
 
    init(A, M, N);
 
    for (int i = 0; i < M; ++i)
        for (int j = 0; j < N; ++j)
            cin >> A[i][j];
 
    for (int i = 0; i < M; ++i, cout << endl)
        for (int j = 0; j < N; ++j)
            cout << A[i][j];
 
    system("pause");
}
inline void init (double &arr_B, int arr_len)
{
    double *p = &arr_B;
    p = new double [arr_len];
}
inline void init (double &arr_A, int arr_len1, int arr_len2)
{
    double *p = &arr_A, *(*pp) = &p;
    pp = new double* [arr_len1];
    for (int i = 0; i < arr_len1; ++i)
        pp[i] = new double [arr_len2];  
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.02.2013, 20:13     Передача двумерного массива в функцию по ссылке
Посмотрите здесь:

Передача двумерного массива в функцию. C++
C++ Передача двумерного массива в функцию
C++ Передача двумерного массива в функцию
C++ Передача двумерного массива в функцию
C++ Передача двумерного массива в функцию
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 1
19.02.2013, 20:15     Передача двумерного массива в функцию по ссылке #2
Цитата Сообщение от devdemobuster Посмотреть сообщение
Для первого варианта вопросов вроде бы нет.
C++
1
2
3
4
5
inline void init (double &arr_B, int arr_len)
{
    double *p = &arr_B;
    p = new double [arr_len];
}
Что, правда не возникает вопросов?
devdemobuster
Сообщений: n/a
19.02.2013, 20:17     Передача двумерного массива в функцию по ссылке #3
А, да, я погорячился. Пока не пробовал, имел в виду, что у компилятора не возникло вопросов.
Не работает и то, и то.
shax624
8 / 8 / 2
Регистрация: 09.03.2012
Сообщений: 94
19.02.2013, 20:29     Передача двумерного массива в функцию по ссылке #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int **vvod (int x, int y)
{
    int  **mas;
    mas=new int *[x];
    for (int i=0; i<x; i++)
    {
        mas[i]=new int [y];
    }
 
    for (int i=0; i<x; i++)
    {
        for (int j=0; j<y; ++j)
        {
            mas[i][j]=rand()%10;
        }
    } 
    return mas;
}

Выделяет память и заполняет случайными числами

Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
int *vvod (int x)
{
    int  *mas;
    mas=new int *[x];
 
    for (int i=0; i<x; i++)
    {
            mas[i]=rand()%10;
    } 
    return mas;
}

для одномерного
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 1
19.02.2013, 20:31     Передача двумерного массива в функцию по ссылке #5
Цитата Сообщение от shax624 Посмотреть сообщение
для одномерного
двойной указатель?

Цитата Сообщение от shax624 Посмотреть сообщение
C++
1
2
3
4
int **mas;
mas=new int *[x];
//...
mas[i]=rand()%10;
unit7
30 / 30 / 4
Регистрация: 07.08.2012
Сообщений: 86
19.02.2013, 20:32     Передача двумерного массива в функцию по ссылке #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void init(double *&arr, int len) {
    arr = new double[len];
}
 
void init(double **&arr, int lenA, int lenB) {
    arr = new double*[lenA];
    for (int i = 0; i < lenB; ++i) {
        arr[i] = new double[lenB];
    }
}
 
int main() {
    double *a;
    double **b;
    
    init(a, 5);
    init(b, 5, 5);
}
shax624
8 / 8 / 2
Регистрация: 09.03.2012
Сообщений: 94
19.02.2013, 20:35     Передача двумерного массива в функцию по ссылке #7
Цитата Сообщение от Croessmah Посмотреть сообщение
двойной указатель?
забыл удалить..
Croessmah
19.02.2013, 20:54
  #8

Не по теме:

Цитата Сообщение от shax624 Посмотреть сообщение
забыл удалить..
И редактирование поста не помогло:

Цитата Сообщение от shax624 Посмотреть сообщение
C++
1
2
    int  *mas;
    mas=new int *[x];

shax624
8 / 8 / 2
Регистрация: 09.03.2012
Сообщений: 94
19.02.2013, 21:19     Передача двумерного массива в функцию по ссылке #9
Цитата Сообщение от Croessmah Посмотреть сообщение

Не по теме:


И редактирование поста не помогло:

int *vvod (int x)
C++
1
2
3
4
5
6
7
8
9
10
{
    int  *mas;
    mas=new int [x];
 
    for (int i=0; i<x; i++)
    {
            mas[i]=rand()%10;
    } 
    return mas;
}
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
20.02.2013, 02:14     Передача двумерного массива в функцию по ссылке #10
devdemobuster, лучше(если уж вы не используете std::vector) было бы сделать обёртки в виде структур и передавать по ссылке их, а не голые указатели, например
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct ArrayOfDouble
{
    double* data;
    size_t length;
};
 
struct ArrayOfDouble2D
{
    double** data;
    size_t rowLength;
    size_t colLength;
};
C++
1
2
3
//...
void arrayOfDouble2DCreate(ArrayOfDouble2D& arr, size_t rowLen, size_t colLen);
void arrayOfDouble2DFree(ArrayOfDouble2D& arr);
Цитата Сообщение от devdemobuster Посмотреть сообщение
C++
1
2
3
pp = new double* [arr_len1];
* * for (int i = 0; i < arr_len1; ++i)
* * * * pp[i] = new double [arr_len2];
Подобные конструкции, это всегда потенциальная утечка. Если на одном из шагов цикла будет выброшен bad_alloс, то вся память, которая была выделена ранее не освободится. Подобные вещи необходимо учитывать.
Цитата Сообщение от unit7 Посмотреть сообщение
C++
1
2
3
4
5
6
void init(double **&arr, int lenA, int lenB) {
* * arr = new double*[lenA];
* * for (int i = 0; i < lenB; ++i) {
* * * * arr[i] = new double[lenB];
* * }
}
Наверное, всё-таки i < lenA, а не i < lenB?
unit7
30 / 30 / 4
Регистрация: 07.08.2012
Сообщений: 86
20.02.2013, 15:19     Передача двумерного массива в функцию по ссылке #11
rangerx, да, конечно ) Ночь была, совсем залип )
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.10.2014, 21:49     Передача двумерного массива в функцию по ссылке
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Whitelake
0 / 0 / 0
Регистрация: 29.10.2014
Сообщений: 8
29.10.2014, 21:49     Передача двумерного массива в функцию по ссылке #12
shax624, а как в Вашем варианте правильно организовать выделение/освобождение памяти под массив, в который будет записываться результат функции vvod в другой функции?

Например, если написать так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main (void)
{
    int **U = new int*[M];
    for(i = 0; i < M; i++)
    {
        U[i] = new int[N];
    }
 
    U = vvod(M,N)
 
    for(i=0; i<M; i++)
    {
        delete []U[i]; U[i] = 0;
    }
    delete []U; U = 0;
 
    return 0;
}
В этом случае память, выделенная в строках 3-7, не будет освобождаться, будет утечка.
Столкнулся с такой проблемой.
Yandex
Объявления
29.10.2014, 21:49     Передача двумерного массива в функцию по ссылке
Ответ Создать тему
Опции темы

Текущее время: 05:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru