2014 dxdy logo

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

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




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

Используется синтаксис 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 
А какой компилятор? У меня gcc не ругается.

 
 
 
 Re: Константы и агрегаты (С++)
Сообщение02.06.2011, 14:16 
Аватара пользователя
VC2005. странно что не ругается... т.е. получается что это совершенно компилятор-зависимая штука не регулируемая стандартом?

 
 
 
 Re: Константы и агрегаты (С++)
Сообщение02.06.2011, 16:24 
Вполне возможно, что просто один из компиляторов этому самому стандарту не соответствует :) .

 
 
 
 Re: Константы и агрегаты (С++)
Сообщение06.06.2011, 13:00 
2volovzi
Цитата:
У меня gcc не ругается.

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

 
 
 
 Re: Константы и агрегаты (С++)
Сообщение14.06.2011, 16:50 
int i[] - это просто другая запись для int *i, таким образом вы объявляете константный указатель. А вот что будет содержаться в этом массиве вовсе не константно, следовательно вы и получаете ошибку.

 
 
 
 Re: Константы и агрегаты (С++)
Сообщение17.06.2011, 17:43 
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 
Код:
i[3]
не является константным выражением.

 
 
 
 Re: Константы и агрегаты (С++)
Сообщение05.07.2011, 14:53 
Используйте динамическое выделение памяти по new

 
 
 
 Re: Константы и агрегаты (С++)
Сообщение08.07.2011, 20:38 
logout2d в сообщении #465392 писал(а):
Используйте динамическое выделение памяти по new

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

 
 
 
 Re: Константы и агрегаты (С++)
Сообщение11.07.2011, 19:12 
Цитата:
Правильнее использовать std::vector

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

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

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

 
 
 
 Re: Константы и агрегаты (С++)
Сообщение11.07.2011, 22:00 
logout2d в сообщении #467344 писал(а):
Цитата:
Правильнее использовать std::vector

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

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

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

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

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

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

 
 
 
 Re: Константы и агрегаты (С++)
Сообщение14.07.2011, 15:38 
Ну с грамматикой согласен.

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

 
 
 [ Сообщений: 13 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group