На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Объявление массива, размер которого приводится из вещественного числа к целому , Просьба помочь разобраться
    Всем добрый день!
    Формальная часть: gcc версия 4.5.4 (Gentoo 4.5.4 p1.1, pie-0.4.7)

    Самая краткая выдержка из некой вычислительной программы

    ExpandedWrap disabled
      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.

    но он не объясняет причины появления ошибки. Скажите, какое семантическое правило я упускаю? Заранее спасибо.
    Сообщение отредактировано: grgdvo -
      Может ты что упустил?
      а твой код у мну компилится
        #define maxh 1000
          Для указания размера массива должна использоваться целочисельная константа, а не переменная, т.к. размер должен быть известен на этапе компиляции.
          Можеш, как сказал Бублик, использовать define
            Цитата chooch @
            должна использоваться целочисельная константа

            а у него разве она не константа?
              Цитата 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
              Сообщение отредактировано: leo -
                2leo:
                спасибо за наводки, надо их переварить и еще раз перечитать и подумать.

                2NeoApostol:
                А что у тебя за компилятор?
                Не уже ли я напоролся на какое-то undefined behaviour, которое каждым разработчиком компилятора понимается по своему.
                  Вообще, я бы не советовал связываться с плавающей точкой в подобных вот случаях. Погрешность вычисления, даже и в компайл-тайм, может привести к тому, что размер массива будет отличаться на 1 от задуманного , а это уже довольно далеко от стандартных ошибок округления для double, не правда ли?
                  По теме - С++03, раздел 5.19 Constant expressions, пункты 1-3.

                  Добавлено
                  И эта... попробуй добавить static к переменной hstep.
                    В LWS (GCC 4.7.2) код успешно собирается при -std=c++11, а вот при -std=c++03 появляется описанная ошибка.
                      Цитата leo @
                      Глянь строчкой выше, п.4 и далее п.10 EXAMPLE 4

                      Цитата Qraizer @
                      По теме - С++03, раздел 5.19 Constant expressions, пункты 1-3.

                      Парни, спасибо!
                      Тема закрыта
                        Цитата Qraizer @
                        И эта... попробуй добавить static к переменной hstep.

                        Та же ошибка! Трактую положительно, как верное следование стандарту в части пункта 5.19 абзац 2 (C++2003).

                        Все таки стандарт мутно написан, три дня потребовалось, чтобы уложилось!
                        хотя, ИМХО, для тех кто читает его только "раз-в-году" - нормальная реакция.
                          А что там верного, если не секрет? По-моему, компилиться должно.

                          Добавлено
                          А, ну да, если ещё прочитать 8.3.4 Arrays пункт 1, то понятно.
                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script execution time: 0.0803 ]   [ 16 queries used ]   [ Generated: 4.07.26, 16:02 GMT ]