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

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

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

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

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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.11.2011, 18:47
Ответы с готовыми решениями:

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

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

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

Массив-константа
Имеются некоторые массивы-константы типа string, описанные в начале программы. Program Rec17;...

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

Не по теме:

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

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

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

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru