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

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

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

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

25.11.2011, 18:47. Просмотров 3181. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос хитрая константа не даёт создать обычный массив (C++):

Можно ли создать проект не managed c++, а обычный c++, но с формами в VS2008? - C++
Можно ли создать проект не managed c++, а обычный c++, но с формами в VS2008?

Перевести обычный массив в векторный - C++
#include <iostream> #include <stdlib.h> #include <math.h> #include <time.h> using namespace std; int main() { int min =...

Как из массива значений цветов создать обычный PNG файл? - C++
Подскажите, знающие люди, как из массива значений цветов (для каждого пикселя) создать обычный PNG файл. Сколько не колесил по интернету...

Скопировать элементы Vector в обычный массив - C++
Вобщем есть поля класса * arr // массив size // размер массива max_size //максимальный размер массива vector <Model> lst; ...

Как создать обычный файл exe, который могут открывать друзья. - C++
Всем доброе утро! Вопрос о том как сделать программу, которая запускалась бы одним файлом .exe. Создал программу (ну самую простейшую)....

Почему матрица выводится как обычный массив - C++
//matriza.h #pragma once class matriza { float *b,max,s; int n,m,nom; public: matriza(); void ww_matriza();

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
25.11.2011, 19:23 #16
Сыроежка, каждый компилятор по разному
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
prazuber
109 / 109 / 3
Регистрация: 29.04.2010
Сообщений: 240
25.11.2011, 19:24 #17
go, это проблемы компилятора.
fasked
Эксперт С++
4935 / 2515 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
25.11.2011, 19:25 #18
go, то, что Вы показываете, называется variable-length array и никакого отношения к сабжу не имеет.
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
25.11.2011, 19:32 #19
Цитата Сообщение от PraZuBeR Посмотреть сообщение
go, это проблемы компилятора.
Нет, вот цитата
Массивы переменной длины

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

Не по теме:


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

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

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

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

Не по теме:

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

Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
25.11.2011, 19:59 #24
Почему размер массива должен быть известен на этапе компиляции? Ведь память выделяется под массив во время выполнения как и для new T[size].
И вообще зачем такое сделали?
Сыроежка
Заблокирован
25.11.2011, 20:04 #25
Цитата Сообщение от Chelioss Посмотреть сообщение
Почему размер массива должен быть известен на этапе компиляции? Ведь память выделяется под массив во время выполнения как и для new T[size].
И вообще зачем такое сделали?
Нет, компилятор должен сгенерировать объектный код, который должен передвинуть указатель стека на конкретное количество байт при входе в функцию.
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
25.11.2011, 20:05 #26
Цитата Сообщение от Chelioss Посмотреть сообщение
Ведь память выделяется под массив во время выполнения
только для массивов, создаваемых на стеке
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
25.11.2011, 20:18 #27
Цитата Сообщение от alex_x_x Посмотреть сообщение
только для массивов, создаваемых на стеке
Я не понял, что вы хотели этим сказать. Под new T[size] выделяется память во время выполнения, хотя выделяется память не в стэке, а в куче.
prazuber
109 / 109 / 3
Регистрация: 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 Посмотреть сообщение
только для массивов, создаваемых в куче
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
25.11.2011, 20:23 #29
Цитата Сообщение от PraZuBeR Посмотреть сообщение
а как можно выделить память во время компиляции для массива
Еще раз. Память под массив выделяется во время выполнения программы или во время компиляции?
prazuber
109 / 109 / 3
Регистрация: 29.04.2010
Сообщений: 240
25.11.2011, 20:25 #30
Chelioss, Если массив объявлен как a[..], то во время компиляции. При этом размер тоже должен быть известен на этапе компиляции. Если же массив динамический, тогда память выделяется в рантайме с помощью new. Собственно поэтому он динамическим и называется.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2011, 20:25
Привет! Вот еще темы с ответами:

Дан массив А на Н элементов (Н-константа). В массиве найти пять максимальных элементов. - C++
Дан массив А на Н элементов (Н-константа). В массиве найти пять максимальных элементов. Написать программу по шагам. Добавлено через...

Двумерный массив <array>. const int value = array.size(); value не константа? - C++
#include &lt;array&gt; #include &lt;iostream&gt; using std::array; using std::cout; /*ФУНКЦИЯ ЗАПОЛНЕНИЯ МАССИВА ЗНАЧЕНИЯМИ*/ template...

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.11.2011, 20:25
Ответ Создать тему
Опции темы

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