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

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

25.11.2011, 18:47. Показов 8766. Ответов 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
114 / 114 / 13
Регистрация: 29.04.2010
Сообщений: 240
25.11.2011, 19:37
Студворк — интернет-сервис помощи студентам
go, прошу прощения, думал, речь о C++.
1
Заблокирован
25.11.2011, 19:41
Цитата Сообщение от 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++.
Лично я веду речь о С++.
1
go
25.11.2011, 19:45

Не по теме:

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

1
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
25.11.2011, 19:59
Почему размер массива должен быть известен на этапе компиляции? Ведь память выделяется под массив во время выполнения как и для new T[size].
И вообще зачем такое сделали?
0
Заблокирован
25.11.2011, 20:04
Цитата Сообщение от Chelioss Посмотреть сообщение
Почему размер массива должен быть известен на этапе компиляции? Ведь память выделяется под массив во время выполнения как и для new T[size].
И вообще зачем такое сделали?
Нет, компилятор должен сгенерировать объектный код, который должен передвинуть указатель стека на конкретное количество байт при входе в функцию.
1
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
25.11.2011, 20:05
Цитата Сообщение от Chelioss Посмотреть сообщение
Ведь память выделяется под массив во время выполнения
только для массивов, создаваемых на стеке
1
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
25.11.2011, 20:18
Цитата Сообщение от alex_x_x Посмотреть сообщение
только для массивов, создаваемых на стеке
Я не понял, что вы хотели этим сказать. Под new T[size] выделяется память во время выполнения, хотя выделяется память не в стэке, а в куче.
0
114 / 114 / 13
Регистрация: 29.04.2010
Сообщений: 240
25.11.2011, 20:21
Chelioss, а как можно выделить память во время компиляции для массива, котоый задан следующим образом:
C++
1
2
3
int n;
cin>>n;
int a[n]; // ???
Upd. Я так понимаю, alex_x_x имел ввиду
Цитата Сообщение от alex_x_x Посмотреть сообщение
только для массивов, создаваемых в куче
1
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
25.11.2011, 20:23
Цитата Сообщение от PraZuBeR Посмотреть сообщение
а как можно выделить память во время компиляции для массива
Еще раз. Память под массив выделяется во время выполнения программы или во время компиляции?
0
114 / 114 / 13
Регистрация: 29.04.2010
Сообщений: 240
25.11.2011, 20:25
Chelioss, Если массив объявлен как a[..], то во время компиляции. При этом размер тоже должен быть известен на этапе компиляции. Если же массив динамический, тогда память выделяется в рантайме с помощью new. Собственно поэтому он динамическим и называется.
1
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
25.11.2011, 20:26
delete
0
114 / 114 / 13
Регистрация: 29.04.2010
Сообщений: 240
25.11.2011, 20:28
go, и? Не понимаю смысла сообщения.
1
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
25.11.2011, 20:31
Что значит вообще "выделяется память"?
При компиляции создается программа и она занимает место на диске. Массив будет содержатся в этом месте? Нет.
А где? Выделяется память в той памяти, которая дает операционная система при запуске приложения? Но ведь это уже после компиляции, а не во время.
0
114 / 114 / 13
Регистрация: 29.04.2010
Сообщений: 240
25.11.2011, 20:37
Да, я неудачно выразился. Память не выделяется на этапе компиляции. Но на этапе компиляции уже известно, сколько памяти надо будет выделить.
Цитата Сообщение от Сыроежка Посмотреть сообщение
компилятор должен сгенерировать объектный код, который должен передвинуть указатель стека на конкретное количество байт при входе в функцию.
Если же массив задан динамически, то компилятор о его размере ничего не знает.

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

Если же массив задан динамически, то компилятор о его размере ничего не знает.
Я не поинмаю, причем здесь "динамически," когда речь идет об объявлении массивов?! Нет такого типа в С++ как "динамический массив". Так что не надо говорить о том, что к вопросу никакого отношения не имеет.
1
114 / 114 / 13
Регистрация: 29.04.2010
Сообщений: 240
25.11.2011, 20:40
Сыроежка, под "динамическим массивом" я понимаю конструкцию
C++
1
T* a = new T[n]
1
Заблокирован
25.11.2011, 20:46
Цитата Сообщение от PraZuBeR Посмотреть сообщение
Сыроежка, под "динамическим массивом" я понимаю конструкцию
C++
1
T* a = new T[n]
Вы что угодно можете под этим понимать, но исходная тема совершенно о другом!
1
114 / 114 / 13
Регистрация: 29.04.2010
Сообщений: 240
25.11.2011, 20:49
На сабж темы я уже ответил. Это полемика, вызванная вопросом
Цитата Сообщение от Chelioss Посмотреть сообщение
Почему размер массива должен быть известен на этапе компиляции? Ведь память выделяется под массив во время выполнения как и для new T[size].
И вообще зачем такое сделали?
И прошу пожалуйста линк, где я говорил фразу "к вопросу никакого отношения не имеет".
1
Заблокирован
25.11.2011, 20:57  [ТС]
Цитата Сообщение от PraZuBeR Посмотреть сообщение
Одни массивы (те, размер которых известен на этапе компиляции) создаются в стеке,
C++
1
2
3
4
int A[100]; //живет в куче, а не на стеке.
//хотя его размер так же должен быть известен на этапе компиляции.
 
int main(){   return 0;};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.11.2011, 20:57
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru