Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.95/39: Рейтинг темы: голосов - 39, средняя оценка - 4.95
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
1

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

04.10.2011, 06:18. Просмотров 8016. Ответов 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
Ответы с готовыми решениями:

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

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

Можно ли обойти динамический массив не зная его размер?
Массив ниже. Есть ли способ обойти такой массив используя указатель pArr на...

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

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

21
greeezz
275 / 168 / 21
Регистрация: 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
Евгений М.
1053 / 990 / 101
Регистрация: 28.02.2010
Сообщений: 2,881
Завершенные тесты: 2
04.10.2011, 06:32 3
Цитата Сообщение от Alex Z Посмотреть сообщение
Так что неправильно то?
C++
1
int i, size, A[size];
Вы хотите создать массив размер которого не определен.

Цитата Сообщение от Alex Z Посмотреть сообщение
Я вроде бы всё по учебнику сделал.
Т.е. Ваш код и код в учебнике абсолютно не отличается. Я прав? Если да - то автора и название учебника в студию.
1
solar_wind
761 / 752 / 58
Регистрация: 06.07.2009
Сообщений: 2,994
Завершенные тесты: 1
04.10.2011, 06:36 4
Alex Z, Так правильно, ты создал массив нулевого размера. Если ты хочешь динамически выделить память под массив используй new и delete
1
greeezz
275 / 168 / 21
Регистрация: 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
Евгений М.
1053 / 990 / 101
Регистрация: 28.02.2010
Сообщений: 2,881
Завершенные тесты: 2
04.10.2011, 06:42 6
Цитата Сообщение от greeezz Посмотреть сообщение
Я правильно понимаю что можно сделать как-то так: ?
Да...
1
solar_wind
761 / 752 / 58
Регистрация: 06.07.2009
Сообщений: 2,994
Завершенные тесты: 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
761 / 752 / 58
Регистрация: 06.07.2009
Сообщений: 2,994
Завершенные тесты: 1
04.10.2011, 06:53 9
greeezz, и желательно в конце работы программы сделать delete myArray
1
greeezz
275 / 168 / 21
Регистрация: 10.07.2011
Сообщений: 441
04.10.2011, 07:02 10
Цитата Сообщение от vitaly1981 Посмотреть сообщение
greeezz, и желательно в конце работы программы сделать delete myArray
Ок,
вопрос по ходу...
а он разве не будет убит автоматически при выходе из функции если в нашем случае является automatic variable?
1
taras atavin
4205 / 1768 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
04.10.2011, 07:03 11
Alex Z, не инициализированный массив - это не специальный вид массива, а просто массив, дефолтно заполняемый мусором.
Массив есть конченое множество однотипных элементов, адресуемых по уникальным индексам
. Число этих элементов должно быть всегда. Но массивы бывают разные. Например,
динамический массив есть массив, число элементов которого переменно.
То есть имеем переменную с семантикой размера массива. Ты когда инт заводишь, всегда ему значение в декларации прописываешь? Также и здесь, только если ты размер динамического массива не задал, то по дефолту не мусор, а ноль. А
C++
1
 int a[]={1, 2, 4, 3, 0}; // статический массив с неявно заданным размером
, то есть ты не указал размер явно в тексте, но он всё равно указан, ни больше, ни меньше элементов уже не станет.
Статический массив есть массив, число элментов которого - константа.
А у динамического массива если ты размер не указал явно, то его будущее значение вообще не известно.
1
solar_wind
761 / 752 / 58
Регистрация: 06.07.2009
Сообщений: 2,994
Завершенные тесты: 1
04.10.2011, 07:04 12
greeezz, Если ты выделишь память через new, то она у тебя будет висеть до конца работы всей программы.
2
greeezz
275 / 168 / 21
Регистрация: 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
Евгений М.
1053 / 990 / 101
Регистрация: 28.02.2010
Сообщений: 2,881
Завершенные тесты: 2
04.10.2011, 07:09 14
Да...
1
solar_wind
761 / 752 / 58
Регистрация: 06.07.2009
Сообщений: 2,994
Завершенные тесты: 1
04.10.2011, 07:10 15
greeezz, Если ты дальше этот массив не планируешь в программе использовать, то именно так.
1
taras atavin
4205 / 1768 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
04.10.2011, 07:10 16
Цитата Сообщение от Alex Z Посмотреть сообщение
Я подумал так: вначале я ввожу с клавиатуры размер массива А (строчка 8),
потом ввожу по очереди все элементы в массив (строчки 10, 11),
а потом чтобы он мне вывел массив на экран (13, 14).
Но не работает. При компиляции 3 ошибки:
Динамический массив так не делается. Идентификатор с квадратными скобками в декларации - это статический массив.
1
silent_1991
Эксперт С++
5011 / 3071 / 271
Регистрация: 11.11.2009
Сообщений: 7,045
Завершенные тесты: 1
04.10.2011, 17:32 17
Хм, а про std::vector никто и не вспомнил...
1
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;
я закоментировал. Потому что после того как я вводил элементы массива, он их удалял и на экран уже выводил непонятные числа. А без этой строчки всё работает.
Всем спасибо за помощь.
0
solar_wind
761 / 752 / 58
Регистрация: 06.07.2009
Сообщений: 2,994
Завершенные тесты: 1
05.10.2011, 07:42 19
Так delete [] myArray; нужно ставить в самом конце! ПРичем это обязательное правило хорошего программиста! Память которую выделил, нужно освободить, когда закончил с ней работать.
Вполне понятно почему тебе после освобождения памяти выводилась всякая фигня
0
ITDeveloper
85 / 85 / 5
Регистрация: 14.01.2011
Сообщений: 265
05.10.2011, 07:53 20
Чтобы не изобретать колесо можно использовать, как уже писал silent_1991, Vector.
0
05.10.2011, 07:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.10.2011, 07:53

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

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

Как создать двумерный динамический массив не зная его размеров?
Привет. Не смог найти в гугле как можно создать двумерный динамический...


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

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

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