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

хитрая константа не даёт создать обычный массив - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.88
Bers
Заблокирован
25.11.2011, 18:47     хитрая константа не даёт создать обычный массив #1
Почему я не могу создать обычный массив, указав константу в качестве количества элементов?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int n=10;
const int N(n); //N вроде как константа 
                     //действительно получает значение 10
 
 
int A[N]; //error C2057: требуется константное выражение
             //error C2466: невозможно выделить память 
             //для массива постоянного нулевого размера
 
int main()
{
   int b= N; //b получает корректное значение 10
   const int c=N; //с получает корректное значение
   return 0;
};
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
prazuber
108 / 108 / 3
Регистрация: 29.04.2010
Сообщений: 240
25.11.2011, 19:37     хитрая константа не даёт создать обычный массив #21
go, прошу прощения, думал, речь о C++.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
25.11.2011, 19:41     хитрая константа не даёт создать обычный массив #22
Цитата Сообщение от go Посмотреть сообщение
Сыроежка, каждый компилятор по разному
C
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
void main ()
{
   int size = 5 ;
   int arr [size] ;
 
printf ("Ok");
 
}
http://codepad.org/8W1Udtgr
Вопрос заключается не в том, как себя ведет тот или иной компилятор, а вопрос заключается в том, что говорит по этому поводу стандарт, то ли он это разрешает делать, то ли он это запрещает делать, то ли оставляет на усмотрение разработчиков компиляторов.

Добавлено через 3 минуты
Цитата Сообщение от PraZuBeR Посмотреть сообщение
go, прошу прощения, думал, речь о C++.
Лично я веду речь о С++.
go
25.11.2011, 19:45
  #23

Не по теме:

Цитата Сообщение от Сыроежка Посмотреть сообщение
Лично я веду речь о С++.
Да я уже понял, что немного не к месту про Си вспомнил, прошу прощения...

Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
25.11.2011, 19:59     хитрая константа не даёт создать обычный массив #24
Почему размер массива должен быть известен на этапе компиляции? Ведь память выделяется под массив во время выполнения как и для new T[size].
И вообще зачем такое сделали?
Сыроежка
Заблокирован
25.11.2011, 20:04     хитрая константа не даёт создать обычный массив #25
Цитата Сообщение от Chelioss Посмотреть сообщение
Почему размер массива должен быть известен на этапе компиляции? Ведь память выделяется под массив во время выполнения как и для new T[size].
И вообще зачем такое сделали?
Нет, компилятор должен сгенерировать объектный код, который должен передвинуть указатель стека на конкретное количество байт при входе в функцию.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
25.11.2011, 20:05     хитрая константа не даёт создать обычный массив #26
Цитата Сообщение от Chelioss Посмотреть сообщение
Ведь память выделяется под массив во время выполнения
только для массивов, создаваемых на стеке
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
25.11.2011, 20:18     хитрая константа не даёт создать обычный массив #27
Цитата Сообщение от alex_x_x Посмотреть сообщение
только для массивов, создаваемых на стеке
Я не понял, что вы хотели этим сказать. Под new T[size] выделяется память во время выполнения, хотя выделяется память не в стэке, а в куче.
prazuber
108 / 108 / 3
Регистрация: 29.04.2010
Сообщений: 240
25.11.2011, 20:21     хитрая константа не даёт создать обычный массив #28
Chelioss, а как можно выделить память во время компиляции для массива, котоый задан следующим образом:
C++
1
2
3
int n;
cin>>n;
int a[n]; // ???
Upd. Я так понимаю, alex_x_x имел ввиду
Цитата Сообщение от alex_x_x Посмотреть сообщение
только для массивов, создаваемых в куче
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
25.11.2011, 20:23     хитрая константа не даёт создать обычный массив #29
Цитата Сообщение от PraZuBeR Посмотреть сообщение
а как можно выделить память во время компиляции для массива
Еще раз. Память под массив выделяется во время выполнения программы или во время компиляции?
prazuber
108 / 108 / 3
Регистрация: 29.04.2010
Сообщений: 240
25.11.2011, 20:25     хитрая константа не даёт создать обычный массив #30
Chelioss, Если массив объявлен как a[..], то во время компиляции. При этом размер тоже должен быть известен на этапе компиляции. Если же массив динамический, тогда память выделяется в рантайме с помощью new. Собственно поэтому он динамическим и называется.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
25.11.2011, 20:26     хитрая константа не даёт создать обычный массив #31
delete
prazuber
108 / 108 / 3
Регистрация: 29.04.2010
Сообщений: 240
25.11.2011, 20:28     хитрая константа не даёт создать обычный массив #32
go, и? Не понимаю смысла сообщения.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
25.11.2011, 20:31     хитрая константа не даёт создать обычный массив #33
Что значит вообще "выделяется память"?
При компиляции создается программа и она занимает место на диске. Массив будет содержатся в этом месте? Нет.
А где? Выделяется память в той памяти, которая дает операционная система при запуске приложения? Но ведь это уже после компиляции, а не во время.
prazuber
108 / 108 / 3
Регистрация: 29.04.2010
Сообщений: 240
25.11.2011, 20:37     хитрая константа не даёт создать обычный массив #34
Да, я неудачно выразился. Память не выделяется на этапе компиляции. Но на этапе компиляции уже известно, сколько памяти надо будет выделить.
Цитата Сообщение от Сыроежка Посмотреть сообщение
компилятор должен сгенерировать объектный код, который должен передвинуть указатель стека на конкретное количество байт при входе в функцию.
Если же массив задан динамически, то компилятор о его размере ничего не знает.

Добавлено через 1 минуту
Одни массивы (те, размер которых известен на этапе компиляции) создаются в стеке, сразу при входе в функцию. Другие - - в куче, и они уже создаются тогда, когда до них дойдет выполнение программы.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
25.11.2011, 20:38     хитрая константа не даёт создать обычный массив #35
Цитата Сообщение от PraZuBeR Посмотреть сообщение
компилятор должен сгенерировать объектный код, который должен передвинуть указатель стека на конкретное количество байт при входе в функцию.
А почему это нельзя сделать во время выполнения? Не компилятором, конечно, а самой программой?
Сыроежка
Заблокирован
25.11.2011, 20:38     хитрая константа не даёт создать обычный массив #36
Цитата Сообщение от PraZuBeR Посмотреть сообщение
Да, я неудачно выразился. Память не выделяется на этапе компиляции. Но на этапе компиляции уже известно, сколько памяти надо будет выделить.

Если же массив задан динамически, то компилятор о его размере ничего не знает.
Я не поинмаю, причем здесь "динамически," когда речь идет об объявлении массивов?! Нет такого типа в С++ как "динамический массив". Так что не надо говорить о том, что к вопросу никакого отношения не имеет.
prazuber
108 / 108 / 3
Регистрация: 29.04.2010
Сообщений: 240
25.11.2011, 20:40     хитрая константа не даёт создать обычный массив #37
Сыроежка, под "динамическим массивом" я понимаю конструкцию
C++
1
T* a = new T[n]
Сыроежка
Заблокирован
25.11.2011, 20:46     хитрая константа не даёт создать обычный массив #38
Цитата Сообщение от PraZuBeR Посмотреть сообщение
Сыроежка, под "динамическим массивом" я понимаю конструкцию
C++
1
T* a = new T[n]
Вы что угодно можете под этим понимать, но исходная тема совершенно о другом!
prazuber
108 / 108 / 3
Регистрация: 29.04.2010
Сообщений: 240
25.11.2011, 20:49     хитрая константа не даёт создать обычный массив #39
На сабж темы я уже ответил. Это полемика, вызванная вопросом
Цитата Сообщение от Chelioss Посмотреть сообщение
Почему размер массива должен быть известен на этапе компиляции? Ведь память выделяется под массив во время выполнения как и для new T[size].
И вообще зачем такое сделали?
И прошу пожалуйста линк, где я говорил фразу "к вопросу никакого отношения не имеет".
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2011, 20:57     хитрая константа не даёт создать обычный массив
Еще ссылки по теме:

C++ Скопировать элементы Vector в обычный массив
Константа Пи в С++ C++
Можно ли создать проект не managed c++, а обычный c++, но с формами в VS2008? C++

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

Или воспользуйтесь поиском по форуму:
Bers
Заблокирован
25.11.2011, 20:57  [ТС]     хитрая константа не даёт создать обычный массив #40
Цитата Сообщение от PraZuBeR Посмотреть сообщение
Одни массивы (те, размер которых известен на этапе компиляции) создаются в стеке,
C++
1
2
3
4
int A[100]; //живет в куче, а не на стеке.
//хотя его размер так же должен быть известен на этапе компиляции.
 
int main(){   return 0;};
Yandex
Объявления
25.11.2011, 20:57     хитрая константа не даёт создать обычный массив
Ответ Создать тему
Опции темы

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