Заблокирован

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

25.11.2011, 18:47. Показов 9069. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru