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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.88
Bers
Заблокирован
#1

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

25.11.2011, 18:47. Просмотров 3161. Ответов 64
Метки нет (Все метки)

Почему я не могу создать обычный массив, указав константу в качестве количества элементов?

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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.11.2011, 18:47     хитрая константа не даёт создать обычный массив
Посмотрите здесь:
Можно ли создать проект не managed c++, а обычный c++, но с формами в VS2008? C++
C++ Перевести обычный массив в векторный
Как из массива значений цветов создать обычный PNG файл? C++
C++ Скопировать элементы Vector в обычный массив
C++ Как создать обычный файл exe, который могут открывать друзья.
Почему матрица выводится как обычный массив C++
C++ Дан массив А на Н элементов (Н-константа). В массиве найти пять максимальных элементов.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
25.11.2011, 18:51     хитрая константа не даёт создать обычный массив #2
Bers, Ибо нех такое творить.

C++
1
2
3
int n = some_long_func();
const int N = n;
int array[N];
И отлично что так не создается.
prazuber
109 / 109 / 3
Регистрация: 29.04.2010
Сообщений: 240
25.11.2011, 18:56     хитрая константа не даёт создать обычный массив #3
Потому что n не const. В новом стандарте, если не ошибаюсь, лечится constexpr.
Bers
Заблокирован
25.11.2011, 18:56  [ТС]     хитрая константа не даёт создать обычный массив #4
Цитата Сообщение от PraZuBeR Посмотреть сообщение
Потому что n не const
При чем здесь вообще n?
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
25.11.2011, 18:59     хитрая константа не даёт создать обычный массив #5
Bers, ну логично должно быть
C++
1
2
3
const int n=10;
const int N(n); //N вроде как константа 
                     //действительно получает значение 1
prazuber
109 / 109 / 3
Регистрация: 29.04.2010
Сообщений: 240
25.11.2011, 18:59     хитрая константа не даёт создать обычный массив #6
Хорошо, выражусь по-другому. Так как n не const, то ее значение неизвестно на этапе компиляции, пускай даже вы присваиваете константу.
Bers
Заблокирован
25.11.2011, 19:01  [ТС]     хитрая константа не даёт создать обычный массив #7
Цитата Сообщение от PraZuBeR Посмотреть сообщение
Хорошо, выражусь по-другому. Так как n не const, то ее значение неизвестно на этапе компиляции, пускай даже вы присваиваете константу.
Ну и что? Константа инициализируется значением, не известным на этапе компиляции. Что здесь такого противозаконного?

Если бы это было нельзя - компилятор ругался бы в принципе на саму попытку таким образом инициализировать константу.

Но он не ругается. Убери массив, и работай с константой, как обычно.

Очень многие константы создаются в рантайме, и почему то на них компилятор никак не буксует.
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
25.11.2011, 19:01     хитрая константа не даёт создать обычный массив #8
Цитата Сообщение от Bers Посмотреть сообщение
При чем здесь вообще n?
Да при том!
C++
1
2
int n=6;
const int N=n; //как видите это не эквивалентно const int N=6
prazuber
109 / 109 / 3
Регистрация: 29.04.2010
Сообщений: 240
25.11.2011, 19:03     хитрая константа не даёт создать обычный массив #9
Цитата Сообщение от Bers Посмотреть сообщение
Ну и что? Константа инициализируется значением, не известным на этапе компиляции. Что здесь такого противозаконного?

Если бы это было нельзя - компилятор ругался бы в принципе на саму попытку таким образом инициализировать константу.

Но он не ругается. Убери массив, и работай с константой, как обычно.

Очень многие константы создаются в рантайме, и почему то на них компилятор никак не буксует.
Тут ничего противозаконного. А вот создание массива с помощью такой константы - вот это противозаконно.
Bers
Заблокирован
25.11.2011, 19:03  [ТС]     хитрая константа не даёт создать обычный массив #10
Цитата Сообщение от go Посмотреть сообщение
Да при том!
Что значит не эквивалентно?

Константа инициализируется один раз при создании. Все. Дальше есть только значение константы.
Никого не волнует, откуда она его получила.
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
25.11.2011, 19:03     хитрая константа не даёт создать обычный массив #11
C++
1
2
const int n=6;
const int N=n;
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
25.11.2011, 19:03     хитрая константа не даёт создать обычный массив #12
Цитата Сообщение от Bers Посмотреть сообщение
Ну и что? Константа инициализируется значением, не известным на этапе компиляции. Что здесь такого противозаконного?
значение константы может зависеть только от других констант
rtfm же
Bers
Заблокирован
25.11.2011, 19:04  [ТС]     хитрая константа не даёт создать обычный массив #13
Цитата Сообщение от alex_x_x Посмотреть сообщение
значение константы может зависеть только от других констант
почему тогда при попытке инициализировать константу не_константой компилятор молчит?

Он ругается только при попытке создать с её помощью массив. А как он вообще определяет, что она палёная? И почему тогда вообще позволяет такие константы делать?
Сыроежка
Заблокирован
25.11.2011, 19:16     хитрая константа не даёт создать обычный массив #14
Цитата Сообщение от Bers Посмотреть сообщение
почему тогда при попытке инициализировать константу не_константой компилятор молчит?

Он ругается только при попытке создать с её помощью массив. А как он вообще определяет, что она палёная? И почему тогда вообще позволяет такие константы делать?
Размер массива компилятор должен знать на этапе компиляции, а ваша константа инициализируется на этапе выполнения. То есть для вашей константы компилятор генерирует некоторый код, который будет пересылать значение из переменной в константу.

Я вам приведу похожий пример. Допустим есть единица компиляции, в которой объявлено

C++
1
const int N = 10;
а в другой единице компиляции объявлено

C++
1
2
3
extern const int N;
 
int a[N];
Компилятор не будет компилировать второй модуль, не смотря на то, что N объявлена как константа, так как компилятору неисзвестно ее значение на этапе компиляции второго модуля.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2011, 19:21     хитрая константа не даёт создать обычный массив
Еще ссылки по теме:
C++ Двумерный массив <array>. const int value = array.size(); value не константа?
Хитрая сортировка C++
C++ Константа
Константа. C++
C++ Константа

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

Или воспользуйтесь поиском по форуму:
prazuber
109 / 109 / 3
Регистрация: 29.04.2010
Сообщений: 240
25.11.2011, 19:21     хитрая константа не даёт создать обычный массив #15
Bers, есть два типа констант. Первые - те, что известны на этапе компиляции. Стандарт про это пишет так:
An integral constant-expression can involve only literals (2.13), enumerators, const variables or static
data members of integral or enumeration types initialized with constant expressions (8.5), non-type template
parameters of integral or enumeration types, and sizeof expressions.
Второй тип - все остальные. Ваше const int N является вторым типом, потому что не попадает в описание первого.
N инициализируется вначале работы программы, но уже в рантайме. Поэтому массив с помощью нее инициализировать нельзя. Зато можно написать такое
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;
 
int f()
{
    int a;
    cin>>a;
    return a;
}
 
const int N(f());
 
int main()
{
    cout<<N<<endl;
};
Upd. Ошибся немного с цитатами, поправил.
Yandex
Объявления
25.11.2011, 19:21     хитрая константа не даёт создать обычный массив
Ответ Создать тему
Опции темы

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