2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Константы и агрегаты (С++)
Сообщение02.06.2011, 08:05 
Аватара пользователя


22/01/11
23
Сидней
Объясните пожалуйста, почему не работает последняя строка следующего примера:

Используется синтаксис C++
const int i[] = { 1, 2, 3, 4 }
float f[i[3]]; // compile error
 


В объяснении говорится: "В таких ситуациях const означает "область памяти с неизменным содержимым". Тем не менее, это значение не может использоваться во время компиляции, поскольку компилятор может не знать содержимого этой памяти."

Вот это "тем не менее" сбивает столку и ничего мне не объясняет... :oops: :cry:
Почему массив f не может быть определен, если элемент i[3] константа и определена во время компиляции? Компилятор не может сгенерить код, рассчитывающий смещение до элемента и узнать его константное значение? Но с другой стороны, конструкция

Используется синтаксис C++
extern const int i = 5;
float f[i];
 


будет прекрасно работать, несмотря на то, что компилятор выделяет ячейку памяти под значение.

 Профиль  
                  
 
 Re: Константы и агрегаты (С++)
Сообщение02.06.2011, 09:51 


03/07/09
9
А какой компилятор? У меня gcc не ругается.

 Профиль  
                  
 
 Re: Константы и агрегаты (С++)
Сообщение02.06.2011, 14:16 
Аватара пользователя


22/01/11
23
Сидней
VC2005. странно что не ругается... т.е. получается что это совершенно компилятор-зависимая штука не регулируемая стандартом?

 Профиль  
                  
 
 Re: Константы и агрегаты (С++)
Сообщение02.06.2011, 16:24 


03/07/09
9
Вполне возможно, что просто один из компиляторов этому самому стандарту не соответствует :) .

 Профиль  
                  
 
 Re: Константы и агрегаты (С++)
Сообщение06.06.2011, 13:00 
Заслуженный участник


26/07/09
1559
Алматы
2volovzi
Цитата:
У меня gcc не ругается.

Просто вы тестируемый код добавили в функцию. :) А вот если его в глобальную область видимости положить, то тогда не скомпилируется (мой gcc пишет, мол, variable-size type declared outside of any function). Никаких расхождений со стандартом конечно же нет, к нему и отсылаю. :)

 Профиль  
                  
 
 Re: Константы и агрегаты (С++)
Сообщение14.06.2011, 16:50 


31/10/10
3
int i[] - это просто другая запись для int *i, таким образом вы объявляете константный указатель. А вот что будет содержаться в этом массиве вовсе не константно, следовательно вы и получаете ошибку.

 Профиль  
                  
 
 Re: Константы и агрегаты (С++)
Сообщение17.06.2011, 17:43 
Заслуженный участник


26/07/09
1559
Алматы
2Mirdin
Вы немного ошибаетесь. Мало того, что тип int [], строго говоря, не эквивалентен int * (вы это уже знаете из соседней темы :) ) Но главное, тип константного указателя выглядит как int * const, а не как const int *. Такие объявления удобно читать справа налево, например const int * читается как "указатель (*) на целочисленную (int) константу (const)".

В стартовом же посте, на мой взгляд, другая проблема. В C слово const фактически просто запрещает компилятору допускать модификацию объекта, но в остальном же такие константы мало чем отличаются от переменных (в C++ ситуация несколько иная). :) Далее в стандартах оговаривается, что в общем случае приходится выделять память под массив констант из-за проблем с отслеживанием использования элементов такого массива. В этом отличие от примера с extern const int i = 5;. Кстати, я не понял, что в данном случае дает extern, ну учитывая наличие инициализирующего литерала; быть может подразумевалось static... В любом случае, при использовании чистого C, ничего подобного сделать не получится (если конкретный компилятор позволяет делать такое, то он обязан выдавать предупреждения об отклонении от стандарта), поэтому в C-программах так популярен #define. :)

Для меня остается открытым вопрос о том, противоречит ли стандарту (C++) компилятор, способный скомпилировать код, предложенный топикстатером, т.е. float f[i[3]]... Ведь, в-принципе, компилятор даже при необходимости выделить память под массив констант может разместить его в области, доступной только для чтения, и таким образом гарантировать, простите за тавтологию, константность констант. Сам буду рад разъяснениям. :)

 Профиль  
                  
 
 Re: Константы и агрегаты (С++)
Сообщение17.06.2011, 23:13 


28/09/09
29
Код:
i[3]
не является константным выражением.

 Профиль  
                  
 
 Re: Константы и агрегаты (С++)
Сообщение05.07.2011, 14:53 


23/11/09
130
Используйте динамическое выделение памяти по new

 Профиль  
                  
 
 Re: Константы и агрегаты (С++)
Сообщение08.07.2011, 20:38 


28/09/09
29
logout2d в сообщении #465392 писал(а):
Используйте динамическое выделение памяти по new

Правильнее использовать std::vector

 Профиль  
                  
 
 Re: Константы и агрегаты (С++)
Сообщение11.07.2011, 19:12 


23/11/09
130
Цитата:
Правильнее использовать std::vector

А чем правильнее?

Вы везде лепите std::... ?
ИМХО статический массив и шаблонные контейнеры принципиально разные вещи.

Мы уже отошли от вопроса :-)

 Профиль  
                  
 
 Re: Константы и агрегаты (С++)
Сообщение11.07.2011, 22:00 


28/09/09
29
logout2d в сообщении #467344 писал(а):
Цитата:
Правильнее использовать std::vector

А чем правильнее?

Тем, что не надо заботиться об освобождении памяти.

Цитата:
ИМХО статический массив и шаблонные контейнеры принципиально разные вещи.

Мы уже отошли от вопроса :-)

Мой комментарий относился исключительно к использования new.

То, что пытается сделать автор невозможно из-за того, что грамматика C++ этого не позволяет.

 Профиль  
                  
 
 Re: Константы и агрегаты (С++)
Сообщение14.07.2011, 15:38 


23/11/09
130
Ну с грамматикой согласен.

Можно конечно использовать и вектор, но надо понимать и достоинства/недостатки :-)

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group