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

Массив произвольного значения - C++

Восстановить пароль Регистрация
 
 
hepr
 Аватар для hepr
60 / 32 / 5
Регистрация: 21.10.2010
Сообщений: 538
02.07.2011, 18:06     Массив произвольного значения #1
Здравствуйте, как построить массив заранее неизвестного значения, ну например
Код
int n;
cin >> n;
int arr[n];
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
02.07.2011, 18:08     Массив произвольного значения #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <new>
//...
int n, *arr;
cin >> n;
try{
  arr = new int[n];
}
catch(bad_alloc xa){
  cerr << "error" << endl;
  return 1;
}
//...
delete[] arr;
hepr
 Аватар для hepr
60 / 32 / 5
Регистрация: 21.10.2010
Сообщений: 538
02.07.2011, 18:31  [ТС]     Массив произвольного значения #3
Когда одномерный массив все работает нормально, но вот с 2 мерным массивом уже проблемы
на этот код
C++
1
2
3
4
5
6
7
8
9
10
    int n,m, *arr;
    cin >> n;
    cin >> m;
    try{
        arr = new int[n][m];
    }
    catch(bad_alloc xa){
        cerr << "error" << endl;
        return 1;
    }
Выдает

Ошибка 1 error C2540: неконстантное выражение используется в качестве границы массива c:\documents and settings\rustam\мои документы\visual studio 2008\projects\project2\1\1\1.cpp 31
Ошибка 2 error C2440: =: невозможно преобразовать 'int (*)[1]' в 'int *' c:\documents and settings\rustam\мои документы\visual studio 2008\projects\project2\1\1\1.cpp 31
nameless
Эксперт C++
 Аватар для nameless
289 / 288 / 14
Регистрация: 16.06.2009
Сообщений: 486
02.07.2011, 18:33     Массив произвольного значения #4
hepr,

Если двумерный массив, то так:

C++
1
2
3
int** arr = new int * [n];
for (int i = 0; i < n; ++i)
    *(arr + i) = new int [m];
hepr
 Аватар для hepr
60 / 32 / 5
Регистрация: 21.10.2010
Сообщений: 538
02.07.2011, 18:45  [ТС]     Массив произвольного значения #5
Спасибо, а не могли бы вы объяснить что вы делаете
nameless
Эксперт C++
 Аватар для nameless
289 / 288 / 14
Регистрация: 16.06.2009
Сообщений: 486
02.07.2011, 18:54     Массив произвольного значения #6
Цитата Сообщение от hepr Посмотреть сообщение
Спасибо, а не могли бы вы объяснить что вы делаете
Цитата Сообщение от nameless Посмотреть сообщение
int** arr = new int * [n];
Выделяем память под массив указателей,

Цитата Сообщение от nameless Посмотреть сообщение
for (int i = 0; i < n; ++i)
*(arr + i) = new int [m];
Выделяем память под массивы..
hepr
 Аватар для hepr
60 / 32 / 5
Регистрация: 21.10.2010
Сообщений: 538
02.07.2011, 19:03  [ТС]     Массив произвольного значения #7
Вроде все понятно, кроме этого
C++
1
*(arr + i)
Что это значит?
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
02.07.2011, 19:03     Массив произвольного значения #8
hepr, arr[i] <=> *(arr + i)
grizlik78
02.07.2011, 19:06
  #9

Не по теме:

А ещё извращённая форма есть
i[arr]

hepr
 Аватар для hepr
60 / 32 / 5
Регистрация: 21.10.2010
Сообщений: 538
02.07.2011, 19:08  [ТС]     Массив произвольного значения #10
Я понимаю что это равносильно arr[i], вопрос в другом, что это за конструкция arr+i, где arr массив
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
02.07.2011, 19:10     Массив произвольного значения #11
Имя массива рассматривается как указатель на его первый элемент. Поэтому работает арифметика указателей и arr+i определяет указатель на элемент с индексом i
hepr
 Аватар для hepr
60 / 32 / 5
Регистрация: 21.10.2010
Сообщений: 538
02.07.2011, 19:11  [ТС]     Массив произвольного значения #12
И еще один вопрос, если позволите, разве теперь нельзя обращаться к массиву как к двумерному
C++
1
    cin >> arr[1][1];
Пишет Ошибка 4 error C2109: для индекса требуется массив или указатель c:\documents and settings\rustam\мои документы\visual studio 2008\projects\project2\1\1\1.cpp 29

Добавлено через 41 секунду
Цитата Сообщение от grizlik78 Посмотреть сообщение
Имя массива рассматривается как указатель на его первый элемент. Поэтому работает арифметика указателей и arr+i определяет указатель на элемент с индексом i
Спасибо, теперь ясно
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
02.07.2011, 19:12     Массив произвольного значения #13
Можно. Показывай объявление arr.
nameless
Эксперт C++
 Аватар для nameless
289 / 288 / 14
Регистрация: 16.06.2009
Сообщений: 486
02.07.2011, 19:14     Массив произвольного значения #14
Цитата Сообщение от hepr Посмотреть сообщение
Я понимаю что это равносильно arr[i], вопрос в другом, что это за конструкция arr+i, где arr массив
arr изначально указывает на нулевой элемент массива, таким образом выполняя операцию (arr + i) мы увеличиваем arr на i * sizeof(int*), т. е на i-й элемент.
hepr
 Аватар для hepr
60 / 32 / 5
Регистрация: 21.10.2010
Сообщений: 538
02.07.2011, 19:16  [ТС]     Массив произвольного значения #15
Если *arr, то пишет указанную ошибку
Если **arr, то пишет что arr используют без предварительной инициализации
Run-Time Check Failure #3 - The variable 'arr' is being used without being initialized.
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
02.07.2011, 19:18     Массив произвольного значения #16
весь код выложи
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
02.07.2011, 19:18     Массив произвольного значения #17
Давай уж код выкладывай. Телепатические помехи в эфире.
hepr
 Аватар для hepr
60 / 32 / 5
Регистрация: 21.10.2010
Сообщений: 538
02.07.2011, 19:22  [ТС]     Массив произвольного значения #18
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int n,m, **arr; //или *arr
    n = m = -1;
        cin << n;
        cin << m;
    try{
        int** arr = new int * [n];
        for (int i = 0; i < n; ++i)
            *(arr + i) = new int [m];
    }
    catch(bad_alloc xa){
        cerr << "error" << endl;
        return 1;
    }
        arr[1][1] = 1;
    cin >> arr[1][1];
    cout << arr[1][1];
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
02.07.2011, 19:26     Массив произвольного значения #19
Цитата Сообщение от hepr Посмотреть сообщение
int** arr = new int * [n];
arr = new int * [n];
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.07.2011, 19:28     Массив произвольного значения
Еще ссылки по теме:

Динамический массив элементов произвольного типа C++
C++ Корень произвольного степени из произвольного числа, введенного с клавиатуры
Выберите все четные элементы произвольного одномерного массива в другой массив C++

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

Или воспользуйтесь поиском по форуму:
nameless
Эксперт C++
 Аватар для nameless
289 / 288 / 14
Регистрация: 16.06.2009
Сообщений: 486
02.07.2011, 19:28     Массив произвольного значения #20
Цитата Сообщение от hepr Посмотреть сообщение
C++
1
2
3
4
5
    try{
        int** arr = new int * [n];
        for (int i = 0; i < n; ++i)
            *(arr + i) = new int [m];
    }
Зачем в блоке try еще раз объявили arr?
Yandex
Объявления
02.07.2011, 19:28     Массив произвольного значения
Ответ Создать тему
Опции темы

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