Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
hepr
61 / 33 / 13
Регистрация: 21.10.2010
Сообщений: 538
#1

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

02.07.2011, 18:06. Просмотров 1097. Ответов 22
Метки нет (Все метки)

Здравствуйте, как построить массив заранее неизвестного значения, ну например
Код
int n;
cin >> n;
int arr[n];

http://www.cyberforum.ru/cpp-beginners/thread807149.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.07.2011, 18:06
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Массив произвольного значения (C++):

Строковый массив произвольного размера
Можно ли каким-то образом образом написать программу, в которой будет вводиться...

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

Вставка в одномерный массив произвольного элемента.
Переменные объявлены глобально. Вот функции для получения рандомного числа и...

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

Можно ли передать в функцию массив произвольного размера ?
Хочу создать функцию для детекта количества элементов в массиве ...

22
asics
Freelance
Эксперт С++
2854 / 1789 / 355
Регистрация: 09.09.2010
Сообщений: 3,841
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;
1
hepr
61 / 33 / 13
Регистрация: 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
0
nameless
Эксперт С++
338 / 302 / 36
Регистрация: 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];
1
hepr
61 / 33 / 13
Регистрация: 21.10.2010
Сообщений: 538
02.07.2011, 18:45  [ТС] #5
Спасибо, а не могли бы вы объяснить что вы делаете
0
nameless
Эксперт С++
338 / 302 / 36
Регистрация: 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];
Выделяем память под массивы..
1
hepr
61 / 33 / 13
Регистрация: 21.10.2010
Сообщений: 538
02.07.2011, 19:03  [ТС] #7
Вроде все понятно, кроме этого
C++
1
*(arr + i)
Что это значит?
0
asics
Freelance
Эксперт С++
2854 / 1789 / 355
Регистрация: 09.09.2010
Сообщений: 3,841
02.07.2011, 19:03 #8
hepr, arr[i] <=> *(arr + i)
1
grizlik78
02.07.2011, 19:06
  #9

Не по теме:

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

0
hepr
61 / 33 / 13
Регистрация: 21.10.2010
Сообщений: 538
02.07.2011, 19:08  [ТС] #10
Я понимаю что это равносильно arr[i], вопрос в другом, что это за конструкция arr+i, где arr массив
0
grizlik78
Эксперт С++
1982 / 1475 / 191
Регистрация: 29.05.2011
Сообщений: 3,048
02.07.2011, 19:10 #11
Имя массива рассматривается как указатель на его первый элемент. Поэтому работает арифметика указателей и arr+i определяет указатель на элемент с индексом i
0
hepr
61 / 33 / 13
Регистрация: 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
Спасибо, теперь ясно
0
grizlik78
Эксперт С++
1982 / 1475 / 191
Регистрация: 29.05.2011
Сообщений: 3,048
02.07.2011, 19:12 #13
Можно. Показывай объявление arr.
0
nameless
Эксперт С++
338 / 302 / 36
Регистрация: 16.06.2009
Сообщений: 486
02.07.2011, 19:14 #14
Цитата Сообщение от hepr Посмотреть сообщение
Я понимаю что это равносильно arr[i], вопрос в другом, что это за конструкция arr+i, где arr массив
arr изначально указывает на нулевой элемент массива, таким образом выполняя операцию (arr + i) мы увеличиваем arr на i * sizeof(int*), т. е на i-й элемент.
0
hepr
61 / 33 / 13
Регистрация: 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.
0
pito211
186 / 173 / 18
Регистрация: 22.03.2010
Сообщений: 612
02.07.2011, 19:18 #16
весь код выложи
0
grizlik78
Эксперт С++
1982 / 1475 / 191
Регистрация: 29.05.2011
Сообщений: 3,048
02.07.2011, 19:18 #17
Давай уж код выкладывай. Телепатические помехи в эфире.
0
hepr
61 / 33 / 13
Регистрация: 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];
0
pito211
186 / 173 / 18
Регистрация: 22.03.2010
Сообщений: 612
02.07.2011, 19:26 #19
Цитата Сообщение от hepr Посмотреть сообщение
int** arr = new int * [n];
arr = new int * [n];
1
nameless
Эксперт С++
338 / 302 / 36
Регистрация: 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?
1
02.07.2011, 19:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.07.2011, 19:28
Привет! Вот еще темы с решениями:

Как вывести на экран массив произвольного размера?
FILE * input = fopen (&quot;имя файла&quot;, &quot;r&quot;); if (input==NULL){...

Можно ли создать функцию, принимающую двумерный массив произвольного размера?
Добрый вечер всем. Я прочитал в книге в главе Передача двумерных массивов в...

Выбрать все нечетные элементы произвольного одномерного массива в другой массив
Выбрать все нечетные элементы произвольного одномерного массива в другой массив

Выберите все четные элементы произвольного одномерного массива в другой массив
Выберете все четные элементы произвольного одномерного массива в другой массив


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

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

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