Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/41: Рейтинг темы: голосов - 41, средняя оценка - 4.56
Заблокирован

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

25.11.2011, 18:47. Показов 8798. Ответов 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;
};
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.11.2011, 18:47
Ответы с готовыми решениями:

Даны функциональная константа, предикатная константа и определённое количество аксиом. Как построить модель
Даны функциональная константа, предикатная константа и определённое количество аксиом. Как построит модель?

Сервер 2008R2- даёт IP 192.168.0.(2-200), и даёт неправильные DNS сервера
Сервер 2008 R2- даёт IP adress например 192.168.0.(2-200), и над значоком интернета восклицательный значок есть без доступа к интернету...

Модем (роутер) не даёт авторизоваться на некоторых сайтах, а также не даёт зарегистрировать антивирус
Здравствуйте! У меня такая ситуация. Обратилась ко мне знакомая - компьютер заблокировался (порнобаннер). Ну, я взял её комп и первым...

64
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
25.11.2011, 18:51
Bers, Ибо нех такое творить.

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

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

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

Очень многие константы создаются в рантайме, и почему то на них компилятор никак не буксует.
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
25.11.2011, 19:01
Цитата Сообщение от Bers Посмотреть сообщение
При чем здесь вообще n?
Да при том!
C++
1
2
int n=6;
const int N=n; //как видите это не эквивалентно const int N=6
0
114 / 114 / 13
Регистрация: 29.04.2010
Сообщений: 240
25.11.2011, 19:03
Цитата Сообщение от Bers Посмотреть сообщение
Ну и что? Константа инициализируется значением, не известным на этапе компиляции. Что здесь такого противозаконного?

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

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

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

Константа инициализируется один раз при создании. Все. Дальше есть только значение константы.
Никого не волнует, откуда она его получила.
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
25.11.2011, 19:03
C++
1
2
const int n=6;
const int N=n;
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
25.11.2011, 19:03
Цитата Сообщение от Bers Посмотреть сообщение
Ну и что? Константа инициализируется значением, не известным на этапе компиляции. Что здесь такого противозаконного?
значение константы может зависеть только от других констант
rtfm же
0
Заблокирован
25.11.2011, 19:04  [ТС]
Цитата Сообщение от alex_x_x Посмотреть сообщение
значение константы может зависеть только от других констант
почему тогда при попытке инициализировать константу не_константой компилятор молчит?

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

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

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

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

C++
1
2
3
extern const int N;
 
int a[N];
Компилятор не будет компилировать второй модуль, не смотря на то, что N объявлена как константа, так как компилятору неисзвестно ее значение на этапе компиляции второго модуля.
1
114 / 114 / 13
Регистрация: 29.04.2010
Сообщений: 240
25.11.2011, 19:21
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. Ошибся немного с цитатами, поправил.
2
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
25.11.2011, 19:23
Сыроежка, каждый компилятор по разному
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
0
114 / 114 / 13
Регистрация: 29.04.2010
Сообщений: 240
25.11.2011, 19:24
go, это проблемы компилятора.
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
25.11.2011, 19:25
go, то, что Вы показываете, называется variable-length array и никакого отношения к сабжу не имеет.
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
25.11.2011, 19:32
Цитата Сообщение от PraZuBeR Посмотреть сообщение
go, это проблемы компилятора.
Нет, вот цитата
Массивы переменной длины

В С89 размерности массивов необходимо объявлять при помощи выражений из целых констант, причем размер массива фиксируется во время компиляции. В силу определенных обстоятельств, в С99 это правило было изменено. В С99 можно объявить массив, размерности которого определяются любыми допустимыми целыми выражениями, в том числе и такими, значения которых становятся известны только во время выполнения. Такой массив называется массивом переменной длины (variable-length array, VLA). Однако такими массивами могут быть только локальные массивы (то есть те, у которых область видимости — прототип или блок).

Не по теме:


Цитата Сообщение от fasked Посмотреть сообщение
то, что Вы показываете, называется variable-length array и никакого отношения к сабжу не имеет.
Не совсем так, нужно просто это понимать ;)

0
Заблокирован
25.11.2011, 19:36
Я написал пример, но никто меня не поправил! Видимо, кроме меня никто стандарт не знает!

То есть в этом примере допущена ошибка

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

C++
1
2
3
extern const int N;
 
int a[N];
По умолчанию константы имеют внутреннее связывание, поэтому в первом модуле также надо добавить спецификатор extern То есть должно быть


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

C++
1
2
3
extern const int N;
 
int a[N];
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.11.2011, 19:36
Помогаю со студенческими работами здесь

Массив-константа
Имеются некоторые массивы-константы типа string, описанные в начале программы. Program Rec17; uses crt,dos; const {блаблабла} ...

Почему ссылка с именем умной таблицы в ячейке не даёт ссылку на эту таблицу в формуле, а имя текстом даёт?
В общем, пытаюсь сделать зависимый список используя именно формулы и проверку данных. И тут столкнулся со странной штукой, оказывается,...

Не даёт создать функцию с двумерным массивом
Делаю задание 1.17 из Керниган, Ричи там где нужно создать программу которая бы выводила все строки длиннее определенной длинны. Создал для...

Static массив не даёт выполнить запись
Здравствуйте. Есть инициализация массива: private static Object object = new Object; Пытаюсь выполнить запись в массив(вызвать методы...

как создать самый обычный сайт
Где будет: 1: Главная, ну и еще пару страниц. 2: Самое главное для сайта и для меня - ВХОД И РЕГИСТРАЦИЯ. Запрет на некоторые...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru