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

Можно ли задать массив, не зная заранее его длину? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 36, средняя оценка - 4.69
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
04.10.2011, 06:18     Можно ли задать массив, не зная заранее его длину? #1
Доброе утро всем.

Вчера начал читать "главу 4 Массивы". Там предложили 2 варианта объявления массива:
1) неинициализированный
C++
1
int A[4];
2) инициализированный
C++
1
int A[]={2,3,5,1};
Я это напечатал, всё работает.

Потом в учебнике написано так:
"Ввод элементов одномерного массива также можно организовать с клавиатуры, например следующим образом:"
И приведён код:
C++
1
2
3
cin>>size;
for (i=0; i<size; i++)
cin>>A[i];
Я это записал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <conio.h> 
using namespace std;
int main() 
{       
    int i, size, A[size];
    cout<<"Vvedite razmer massiva"<<endl<<"size=";
    cin>>size;
 
    for (i=0; i<size; i++)
        cin>>A[i];
    
    for (i=0; i<size; i++)
        cout<<A[i]<<endl;
        
    getch();  
    return 0;
}
Я подумал так: вначале я ввожу с клавиатуры размер массива А (строчка 8),
потом ввожу по очереди все элементы в массив (строчки 10, 11),
а потом чтобы он мне вывел массив на экран (13, 14).

Но не работает. При компиляции 3 ошибки:
error C2057: требуется константное выражение
error C2466: невозможно выделить память для массива постоянного нулевого размера
error C2133: A: неизвестный размер

Так что неправильно то? Я вроде бы всё по учебнику сделал.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.10.2011, 06:18     Можно ли задать массив, не зная заранее его длину?
Посмотрите здесь:

Можно работать с файлом зная что он в одной директории с экзешником но не зная в какой ? C++
C++ Как можно объявить класс, заранее не зная его тип template.
Преобразовать массив удвоив длину его серии C++
C++ как захватить динамически память, не зная заранее какое количество памяти надо?
C++ как задать массив n на m и заполнить его с клавиатуры
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
04.10.2011, 06:30     Можно ли задать массив, не зная заранее его длину? #2
вот тут написано:
NOTE: The elements field within brackets [] which represents the number of elements the array is going to hold, must be a constant value, since arrays are blocks of non-dynamic memory whose size must be determined before execution. In order to create arrays with a variable length dynamic memory is needed, which is explained later in these tutorials.

Сталобыть необходимо задавать размер массива при его создании.
Евгений М.
1033 / 974 / 53
Регистрация: 28.02.2010
Сообщений: 2,817
Завершенные тесты: 2
04.10.2011, 06:32     Можно ли задать массив, не зная заранее его длину? #3
Цитата Сообщение от Alex Z Посмотреть сообщение
Так что неправильно то?
C++
1
int i, size, A[size];
Вы хотите создать массив размер которого не определен.

Цитата Сообщение от Alex Z Посмотреть сообщение
Я вроде бы всё по учебнику сделал.
Т.е. Ваш код и код в учебнике абсолютно не отличается. Я прав? Если да - то автора и название учебника в студию.
solar_wind
 Аватар для solar_wind
740 / 731 / 39
Регистрация: 06.07.2009
Сообщений: 2,937
Завершенные тесты: 1
04.10.2011, 06:36     Можно ли задать массив, не зная заранее его длину? #4
Alex Z, Так правильно, ты создал массив нулевого размера. Если ты хочешь динамически выделить память под массив используй new и delete
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
04.10.2011, 06:40     Можно ли задать массив, не зная заранее его длину? #5
vitaly1981,
Я правильно понимаю что можно сделать как-то так: ?
C++
1
2
3
4
5
6
7
cin>>size;
 
int * myArray;
myArray = new int [size];
 
for (i=0; i<size; i++)
cin>>myArray[i];
Евгений М.
1033 / 974 / 53
Регистрация: 28.02.2010
Сообщений: 2,817
Завершенные тесты: 2
04.10.2011, 06:42     Можно ли задать массив, не зная заранее его длину? #6
Цитата Сообщение от greeezz Посмотреть сообщение
Я правильно понимаю что можно сделать как-то так: ?
Да...
solar_wind
 Аватар для solar_wind
740 / 731 / 39
Регистрация: 06.07.2009
Сообщений: 2,937
Завершенные тесты: 1
04.10.2011, 06:43     Можно ли задать массив, не зная заранее его длину? #7
greeezz,

Да, только у тебя ошибочка небольшая:

C++
1
2
3
4
5
6
cin>>size;
int * myArray;
myArray = new int [size];
 
for (i=0; i<size; i++)
cin>>myArray[i];
greeezz
04.10.2011, 06:47
  #8

Не по теме:

vitaly1981,
Спасибо, исправил. Копипаст жить спокойно не дает.

solar_wind
 Аватар для solar_wind
740 / 731 / 39
Регистрация: 06.07.2009
Сообщений: 2,937
Завершенные тесты: 1
04.10.2011, 06:53     Можно ли задать массив, не зная заранее его длину? #9
greeezz, и желательно в конце работы программы сделать delete myArray
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
04.10.2011, 07:02     Можно ли задать массив, не зная заранее его длину? #10
Цитата Сообщение от vitaly1981 Посмотреть сообщение
greeezz, и желательно в конце работы программы сделать delete myArray
Ок,
вопрос по ходу...
а он разве не будет убит автоматически при выходе из функции если в нашем случае является automatic variable?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
04.10.2011, 07:03     Можно ли задать массив, не зная заранее его длину? #11
Alex Z, не инициализированный массив - это не специальный вид массива, а просто массив, дефолтно заполняемый мусором.
Массив есть конченое множество однотипных элементов, адресуемых по уникальным индексам
. Число этих элементов должно быть всегда. Но массивы бывают разные. Например,
динамический массив есть массив, число элементов которого переменно.
То есть имеем переменную с семантикой размера массива. Ты когда инт заводишь, всегда ему значение в декларации прописываешь? Также и здесь, только если ты размер динамического массива не задал, то по дефолту не мусор, а ноль. А
C++
1
 int a[]={1, 2, 4, 3, 0}; // статический массив с неявно заданным размером
, то есть ты не указал размер явно в тексте, но он всё равно указан, ни больше, ни меньше элементов уже не станет.
Статический массив есть массив, число элментов которого - константа.
А у динамического массива если ты размер не указал явно, то его будущее значение вообще не известно.
solar_wind
 Аватар для solar_wind
740 / 731 / 39
Регистрация: 06.07.2009
Сообщений: 2,937
Завершенные тесты: 1
04.10.2011, 07:04     Можно ли задать массив, не зная заранее его длину? #12
greeezz, Если ты выделишь память через new, то она у тебя будет висеть до конца работы всей программы.
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
04.10.2011, 07:08     Можно ли задать массив, не зная заранее его длину? #13
vitaly1981,
значит в данном случае должно быть как-то так:


C++
1
2
3
4
5
6
7
8
cin>>size;
int * myArray;
myArray = new int [size];
 
for (i=0; i<size; i++)
cin>>myArray[i];
 
delete[] myArray;
Евгений М.
1033 / 974 / 53
Регистрация: 28.02.2010
Сообщений: 2,817
Завершенные тесты: 2
04.10.2011, 07:09     Можно ли задать массив, не зная заранее его длину? #14
Да...
solar_wind
 Аватар для solar_wind
740 / 731 / 39
Регистрация: 06.07.2009
Сообщений: 2,937
Завершенные тесты: 1
04.10.2011, 07:10     Можно ли задать массив, не зная заранее его длину? #15
greeezz, Если ты дальше этот массив не планируешь в программе использовать, то именно так.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
04.10.2011, 07:10     Можно ли задать массив, не зная заранее его длину? #16
Цитата Сообщение от Alex Z Посмотреть сообщение
Я подумал так: вначале я ввожу с клавиатуры размер массива А (строчка 8),
потом ввожу по очереди все элементы в массив (строчки 10, 11),
а потом чтобы он мне вывел массив на экран (13, 14).
Но не работает. При компиляции 3 ошибки:
Динамический массив так не делается. Идентификатор с квадратными скобками в декларации - это статический массив.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
04.10.2011, 17:32     Можно ли задать массив, не зная заранее его длину? #17
Хм, а про std::vector никто и не вспомнил...
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
05.10.2011, 07:37  [ТС]     Можно ли задать массив, не зная заранее его длину? #18
Цитата Сообщение от greeezz Посмотреть сообщение
vitaly1981,
значит в данном случае должно быть как-то так:


C++
1
2
3
4
5
6
7
8
cin>>size;
int * myArray;
myArray = new int [size];
 
for (i=0; i<size; i++)
cin>>myArray[i];
 
delete[] myArray;
Я написал этот вариант. Вот так:
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
#include <iostream>
#include <conio.h> 
using namespace std;
int main() 
{       
    int i, size;
    cout<<"Vvedite razmer massiva"<<endl<<"size=";
    cin>>size;
 
    int * myArray;
    myArray = new int [size]; 
 
    for (i=0; i<size; i++)
    {
        cout<<"myArray["<<i<<"]=";
        cin>>myArray[i];
    } 
 
    //delete[] myArray;
 
    for (i=0; i<size; i++)
        cout<<myArray[i]<<endl;
        
    getch();  
    return 0; 
}
Cтрочку:
C++
1
delete[] myArray;
я закоментировал. Потому что после того как я вводил элементы массива, он их удалял и на экран уже выводил непонятные числа. А без этой строчки всё работает.
Всем спасибо за помощь.
solar_wind
 Аватар для solar_wind
740 / 731 / 39
Регистрация: 06.07.2009
Сообщений: 2,937
Завершенные тесты: 1
05.10.2011, 07:42     Можно ли задать массив, не зная заранее его длину? #19
Так delete [] myArray; нужно ставить в самом конце! ПРичем это обязательное правило хорошего программиста! Память которую выделил, нужно освободить, когда закончил с ней работать.
Вполне понятно почему тебе после освобождения памяти выводилась всякая фигня
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.10.2011, 07:53     Можно ли задать массив, не зная заранее его длину?
Еще ссылки по теме:

Как прочитать последовательно все текстовые файлы лежащие в папке, не зная заранее их имен? C++
C++ Найти длину диагонали, периметр и площадь прямоугольника, зная длины его сторон
C++ Найти площадь поверхности и объем куба, зная длину его ребра.

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

Или воспользуйтесь поиском по форуму:
ITDeveloper
 Аватар для ITDeveloper
85 / 85 / 5
Регистрация: 14.01.2011
Сообщений: 263
05.10.2011, 07:53     Можно ли задать массив, не зная заранее его длину? #20
Чтобы не изобретать колесо можно использовать, как уже писал silent_1991, Vector.
Yandex
Объявления
05.10.2011, 07:53     Можно ли задать массив, не зная заранее его длину?
Ответ Создать тему
Опции темы

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