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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 36, средняя оценка - 4.69
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
#1

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

04.10.2011, 06:18. Просмотров 5328. Ответов 21
Метки нет (Все метки)

Доброе утро всем.

Вчера начал читать "главу 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: неизвестный размер

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

Как можно объявить класс, заранее не зная его тип template. - C++
Класс: template &lt;class type&gt; class My { private: int n; double sum; type *al; public: My() { al =...

Массив. Можно ли задать длину массива переменной - C++
Хочу сделать, чтобы можно было указать длину массива непосредственно во время использования программы, но компилятор выдаёт ошибку:...

Можно ли обойти динамический массив не зная его размер? - C++
Массив ниже. Есть ли способ обойти такой массив используя указатель pArr на него? Не используя count. int count = 7; int...

Найти площадь поверхности и объем куба, зная длину его ребра. - C++
Мы знаем длину ребра куба. Найти лицевой области, общую площадь поверхности и объем куба. Формат входных данных Ввод содержит одну...

Найти объём куба и площадь его боковой поверхности, зная длину ребра - C++
Всем привет, друзья! Очень нужна помощь. Дана длина ребра куба. Найти объём куба и площадь его боковой поверхности.

Найти длину диагонали, периметр и площадь прямоугольника, зная длины его сторон - C++
1б) даны стороны прямоугольника a, b. Найти длину диагонали, периметр и площадь.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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.

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

Цитата Сообщение от Alex Z Посмотреть сообщение
Я вроде бы всё по учебнику сделал.
Т.е. Ваш код и код в учебнике абсолютно не отличается. Я прав? Если да - то автора и название учебника в студию.
1
solar_wind
756 / 747 / 42
Регистрация: 06.07.2009
Сообщений: 2,969
Завершенные тесты: 1
04.10.2011, 06:36 #4
Alex Z, Так правильно, ты создал массив нулевого размера. Если ты хочешь динамически выделить память под массив используй new и delete
1
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];
1
Евгений М.
1035 / 976 / 54
Регистрация: 28.02.2010
Сообщений: 2,829
Завершенные тесты: 2
04.10.2011, 06:42 #6
Цитата Сообщение от greeezz Посмотреть сообщение
Я правильно понимаю что можно сделать как-то так: ?
Да...
1
solar_wind
756 / 747 / 42
Регистрация: 06.07.2009
Сообщений: 2,969
Завершенные тесты: 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];
1
greeezz
04.10.2011, 06:47
  #8

Не по теме:

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

1
solar_wind
756 / 747 / 42
Регистрация: 06.07.2009
Сообщений: 2,969
Завершенные тесты: 1
04.10.2011, 06:53 #9
greeezz, и желательно в конце работы программы сделать delete myArray
1
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
04.10.2011, 07:02 #10
Цитата Сообщение от vitaly1981 Посмотреть сообщение
greeezz, и желательно в конце работы программы сделать delete myArray
Ок,
вопрос по ходу...
а он разве не будет убит автоматически при выходе из функции если в нашем случае является automatic variable?
1
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
04.10.2011, 07:03 #11
Alex Z, не инициализированный массив - это не специальный вид массива, а просто массив, дефолтно заполняемый мусором.
Массив есть конченое множество однотипных элементов, адресуемых по уникальным индексам
. Число этих элементов должно быть всегда. Но массивы бывают разные. Например,
динамический массив есть массив, число элементов которого переменно.
То есть имеем переменную с семантикой размера массива. Ты когда инт заводишь, всегда ему значение в декларации прописываешь? Также и здесь, только если ты размер динамического массива не задал, то по дефолту не мусор, а ноль. А
C++
1
 int a[]={1, 2, 4, 3, 0}; // статический массив с неявно заданным размером
, то есть ты не указал размер явно в тексте, но он всё равно указан, ни больше, ни меньше элементов уже не станет.
Статический массив есть массив, число элментов которого - константа.
А у динамического массива если ты размер не указал явно, то его будущее значение вообще не известно.
1
solar_wind
756 / 747 / 42
Регистрация: 06.07.2009
Сообщений: 2,969
Завершенные тесты: 1
04.10.2011, 07:04 #12
greeezz, Если ты выделишь память через new, то она у тебя будет висеть до конца работы всей программы.
2
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;
1
Евгений М.
1035 / 976 / 54
Регистрация: 28.02.2010
Сообщений: 2,829
Завершенные тесты: 2
04.10.2011, 07:09 #14
Да...
1
solar_wind
756 / 747 / 42
Регистрация: 06.07.2009
Сообщений: 2,969
Завершенные тесты: 1
04.10.2011, 07:10 #15
greeezz, Если ты дальше этот массив не планируешь в программе использовать, то именно так.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.10.2011, 07:10
Привет! Вот еще темы с ответами:

Сформулировать одномерный массив, задать его значения при инициализации и вывести его на экран - C++
Друзья, помогите пожалуйста с решением данной задачи, плохо разбираюсь в C++, по этому пожалуйста объясните мне что как работает, буду...

Можно работать с файлом зная что он в одной директории с экзешником но не зная в какой ? - C++
Вот И если нет - надо узнавать директорию ? А каким образом ? То есть программа будет запускаться из любой директории и создавать...

Массив: Как можно задать и вывести симметричный двумерный массив? - C++
как можно задать и вывести симметричный массив

Как захватить динамически память, не зная заранее, какое количество памяти надо? - C++
задание Считайте все записи из файла &quot;6.dat&quot;. Для чтения каждой отдельной записи осуществите динамический захват памяти. Предполагается,...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
04.10.2011, 07:10
Ответ Создать тему
Опции темы

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