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

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

Войти
Регистрация
Восстановить пароль
 
Lucky721
0 / 0 / 2
Регистрация: 13.04.2013
Сообщений: 65
#1

Вызов двумерного массива - C++

29.05.2013, 19:58. Просмотров 320. Ответов 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
#include<math.h>
#include<windows.h>
#include<iostream.h>
#include<stdlib.h>
int CreateArray(int a, int b, int n, int m) {
    int** Arr = new int *[n];
    for (int i = 0; i < n; i++) {
    Arr[i] = new int [m];
    }
    for (i=0;i<n; i++) {
        for(int j=0;j<m; j++) {
            Arr[i][j]=rand() % (b - a + 1) + a;
        }
    }
    return 0;
}
void main() {
     SetConsoleOutputCP(1251);
     int a, b, m, n;
     cout << " Введите ширину массива: \n";
     cin>>n;
     cout << " Введите длину массива: \n";
     cin>>m;
     cout << " Введите нижнюю границу диапазона : \n";
     cin>>a;
     cout << " Введите верхнюю границу диапазона: \n";
     cin>>b;
     CreateArray(a,b,n,m);
     
 
 
}

Нужна помощь. В этой функции я создаю двумерный массив размера m на n с числами из диапазона [a,b]. Как мне к нему обратиться в основной функции?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Гром
 Аватар для Гром
199 / 118 / 10
Регистрация: 20.03.2009
Сообщений: 1,080
Записей в блоге: 16
29.05.2013, 20:06     Вызов двумерного массива #2
Возвращайте вместо нуля Arr:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int CreateArray(int a, int b, int n, int m) {
    int** Arr = new int *[n];
    for (int i = 0; i < n; i++) {
        Arr[i] = new int [m];
        for(int j=0;j<m; j++) {
            Arr[i][j]=rand() % (b - a + 1) + a;
        }
    }
    return Arr;
}
 
int main()
{
//...
int** MyArr = CreateArray(a, b , n, m);
std::cout << MyArr[0][0];
for (int i = 0; i < n; ++i)
    delete[] MyArr[i];
delete[] MyArr;
}
Lucky721
0 / 0 / 2
Регистрация: 13.04.2013
Сообщений: 65
29.05.2013, 20:33  [ТС]     Вызов двумерного массива #3
C++
1
2
3
4
5
int** MyArr = CreateArray(a, b , n, m);
std::cout << MyArr[0][0];
for (int i = 0; i < n; ++i)
    delete[] MyArr[i];
delete[] MyArr;
вот эта часть кода обязательна?
Как мне просто в майн функции к примеру напечатать его. Точнее циклы я знаю, просто, как обращаться?
Гром
 Аватар для Гром
199 / 118 / 10
Регистрация: 20.03.2009
Сообщений: 1,080
Записей в блоге: 16
29.05.2013, 20:42     Вызов двумерного массива #4
Вы присваиваете переменной MyArr нужного типа то значение, которое создали в функции CreateArray, т.е. указатель на созданный массив. А потом обращаетесь с ним как с обычным массивом. Конечно, надо не забывать подчищать за собой память в конце.
C++
1
std::cout << MyArr[0][0];
это просто пример использования - вывели угловой элемент массива.
Lucky721
0 / 0 / 2
Регистрация: 13.04.2013
Сообщений: 65
29.05.2013, 20:47  [ТС]     Вызов двумерного массива #5
C++
1
error C2440: 'return' : cannot convert from 'int ** ' to 'int'
Вот такую ошибку выводит
Гром
 Аватар для Гром
199 / 118 / 10
Регистрация: 20.03.2009
Сообщений: 1,080
Записей в блоге: 16
29.05.2013, 20:50     Вызов двумерного массива #6
Опечатка у меня. Забыл поправить int CreateArray(аргументы) на int** CreateArray(аргументы)
Lucky721
0 / 0 / 2
Регистрация: 13.04.2013
Сообщений: 65
29.05.2013, 20:59  [ТС]     Вызов двумерного массива #7
Теперь собственно
C++
1
error C2065: 'Arr' : undeclared identifier
как и было в начале, вот в этой строке
C++
1
cout<<Arr[i][j]<<"\t";
Добавлено через 1 минуту
Ой, теперь моя ошибка, все в норме
Гром
 Аватар для Гром
199 / 118 / 10
Регистрация: 20.03.2009
Сообщений: 1,080
Записей в блоге: 16
29.05.2013, 21:04     Вызов двумерного массива #8
Код вне функции CreateArray ничего не знает про ее внутренние данные, и не должен знать. Именно поэтому мы передаем во внешний мир созданный массив в качестве результата функции. Если мы просто вызовем ее и никуда не запишем результат, то все данные о созданном масииве окажутся навеки потеряны, и мы не сможем с ним никак работать. Если мы присвоим указатель на возвращенный массив некоторой переменной (типа указатель нужного типа), то через эту переменную сможем работать с массивом.
В данном случае вам надо работать уже с MyArr, поскольку данные о массиве мы сохранили туда.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2013, 21:40     Вызов двумерного массива
Еще ссылки по теме:

Сортировка двумерного массива C++
C++ Размер двумерного массива
Заполнение двумерного массива C++
Заполнение двумерного массива C++
C++ Формирование двумерного массива

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

Или воспользуйтесь поиском по форуму:
Lucky721
0 / 0 / 2
Регистрация: 13.04.2013
Сообщений: 65
29.05.2013, 21:40  [ТС]     Вызов двумерного массива #9
Цитата Сообщение от Гром Посмотреть сообщение
Код вне функции CreateArray ничего не знает про ее внутренние данные, и не должен знать. Именно поэтому мы передаем во внешний мир созданный массив в качестве результата функции. Если мы просто вызовем ее и никуда не запишем результат, то все данные о созданном масииве окажутся навеки потеряны, и мы не сможем с ним никак работать. Если мы присвоим указатель на возвращенный массив некоторой переменной (типа указатель нужного типа), то через эту переменную сможем работать с массивом.
В данном случае вам надо работать уже с MyArr, поскольку данные о массиве мы сохранили туда.
Большое спасибо т.е MyArr это указатель на массив?

Добавлено через 13 минут
Цитата Сообщение от Lucky721 Посмотреть сообщение
Большое спасибо т.е MyArr это указатель на массив?
точнее указатель на указать на массив
И еще вопрос, если мне нужно написать еще одну функцию для работы с массивом, в качестве параметра мне передавать сам массив MyArr и его размерности?
Yandex
Объявления
29.05.2013, 21:40     Вызов двумерного массива
Ответ Создать тему
Опции темы

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