Объявление массива, размер которого приводится из вещественного числа к целому
, Просьба помочь разобраться
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.94] |
|
|
Объявление массива, размер которого приводится из вещественного числа к целому
, Просьба помочь разобраться
|
Сообщ.
#1
,
|
|
|
|
Всем добрый день!
Формальная часть: gcc версия 4.5.4 (Gentoo 4.5.4 p1.1, pie-0.4.7) Самая краткая выдержка из некой вычислительной программы ![]() ![]() const double hstep = 2.5e-2; #define HSTEP 2.5e-2 const unsigned int maxh = (unsigned int)(1 / hstep) + 3; const unsigned int MAXH = (unsigned int)(1 / HSTEP) + 3; double f[maxh]; // <-- ERROR here double F[MAXH]; // OK! int main(int argc, char *argv[]) { double f[maxh]; // OK too!!! ===8-000 return 0; } Почему получаю ошибку: tmp.cpp:7:14: ошибка: array bound is not an integer constant before ‘]’ token ?? При этом через препроцессор все приводится к целому типу нормально, более того в контексте функции все объявляется. Что не так с глобальным контекстом? Может быть знатоки ткнут носом в стандарт?! Читаю ISO 9899:1999 (он же C99), пока нашел только похожий пункт в разделе Array declarators (6.7.5.2 пункт 5), Скрытый текст If the size is an expression that is not an integer constant expression: if it occurs in a declaration at function prototype scope, it is treated as if it were replaced by *; otherwise, each time it is evaluated it shall have a value greater than zero. но он не объясняет причины появления ошибки. Скажите, какое семантическое правило я упускаю? Заранее спасибо. |
|
Сообщ.
#2
,
|
|
|
|
Может ты что упустил?
а твой код у мну компилится |
|
Сообщ.
#3
,
|
|
|
|
#define maxh 1000
|
|
Сообщ.
#4
,
|
|
|
|
Для указания размера массива должна использоваться целочисельная константа, а не переменная, т.к. размер должен быть известен на этапе компиляции.
Можеш, как сказал Бублик, использовать define |
|
Сообщ.
#5
,
|
|
|
|
Цитата chooch @ должна использоваться целочисельная константа а у него разве она не константа? |
|
Сообщ.
#6
,
|
|
|
|
Цитата NeoApostol @ Читаю ISO 9899:1999 (он же C99), пока нашел только похожий пункт в разделе Array declarators (6.7.5.2 пункт 5),... Скажите, какое семантическое правило я упускаю? Глянь строчкой выше, п.4 Цитата If the size is an integer constant expression and the element type has a known constant size, the array type is not a variable length array type; otherwise, the array type is a variable length array type. и далее п.10 EXAMPLE 4 Цитата Array objects declared with the static or extern storage-class specifier cannot have a variable length array (VLA) type. Что есть Integer constant expression см.6.6 Constant expressions, п.6 |
|
Сообщ.
#7
,
|
|
|
|
2leo:
спасибо за наводки, надо их переварить и еще раз перечитать и подумать. 2NeoApostol: А что у тебя за компилятор? Не уже ли я напоролся на какое-то undefined behaviour, которое каждым разработчиком компилятора понимается по своему. |
|
Сообщ.
#8
,
|
|
|
|
Вообще, я бы не советовал связываться с плавающей точкой в подобных вот случаях. Погрешность вычисления, даже и в компайл-тайм, может привести к тому, что размер массива будет отличаться на 1 от задуманного , а это уже довольно далеко от стандартных ошибок округления для double, не правда ли?
По теме - С++03, раздел 5.19 Constant expressions, пункты 1-3. Добавлено И эта... попробуй добавить static к переменной hstep. |
|
Сообщ.
#9
,
|
|
|
|
В LWS (GCC 4.7.2) код успешно собирается при -std=c++11, а вот при -std=c++03 появляется описанная ошибка.
|
|
Сообщ.
#10
,
|
|
|
|
Цитата leo @ Глянь строчкой выше, п.4 и далее п.10 EXAMPLE 4 Цитата Qraizer @ По теме - С++03, раздел 5.19 Constant expressions, пункты 1-3. Парни, спасибо! Тема закрыта |
|
Сообщ.
#11
,
|
|
|
|
Цитата Qraizer @ И эта... попробуй добавить static к переменной hstep. Та же ошибка! Трактую положительно, как верное следование стандарту в части пункта 5.19 абзац 2 (C++2003). Все таки стандарт мутно написан, три дня потребовалось, чтобы уложилось! хотя, ИМХО, для тех кто читает его только "раз-в-году" - нормальная реакция. |
|
Сообщ.
#12
,
|
|
|
|
А что там верного, если не секрет? По-моему, компилиться должно.
Добавлено А, ну да, если ещё прочитать 8.3.4 Arrays пункт 1, то понятно. |