Ошибка c2057 требуется константное выражение

if(stat("seek.pc.db", &files) ==0 )
     sizes=files.st_size;

sizes=sizes/sizeof(int);
int s[sizes];

I am compiling this in Visual Studio 2008 and I am getting the following error:
error C2057: expected constant expression
error C2466: cannot allocate an array of constant size 0.

I tried using vector s[sizes] but of no avail. What am I doing wrong?

Thanks!

asked Sep 5, 2011 at 3:47

Ava's user avatar

1

The sizes of array variables in C must be known at compile time. If you know it only at run time you will have to malloc some memory yourself instead.

answered Sep 5, 2011 at 3:55

hmakholm left over Monica's user avatar

5

Size of an array must be a compile time constant. However, C99 supports variable length arrays. So instead for your code to work on your environment, if the size of the array is known at run-time then —

int *s = malloc(sizes);
// ....
free s;

Regarding the error message:

int a[5];
   // ^ 5 is a constant expression

int b = 10;
int aa[b];
    // ^   b is a variable. So, it's value can differ at some other point.

const int size = 5;
int aaa[size];  // size is constant.

answered Sep 5, 2011 at 4:05

Mahesh's user avatar

MaheshMahesh

34.4k20 gold badges88 silver badges115 bronze badges

5

if(stat("seek.pc.db", &files) ==0 )
     sizes=files.st_size;

sizes=sizes/sizeof(int);
int s[sizes];

I am compiling this in Visual Studio 2008 and I am getting the following error:
error C2057: expected constant expression
error C2466: cannot allocate an array of constant size 0.

I tried using vector s[sizes] but of no avail. What am I doing wrong?

Thanks!

asked Sep 5, 2011 at 3:47

Ava's user avatar

1

The sizes of array variables in C must be known at compile time. If you know it only at run time you will have to malloc some memory yourself instead.

answered Sep 5, 2011 at 3:55

hmakholm left over Monica's user avatar

5

Size of an array must be a compile time constant. However, C99 supports variable length arrays. So instead for your code to work on your environment, if the size of the array is known at run-time then —

int *s = malloc(sizes);
// ....
free s;

Regarding the error message:

int a[5];
   // ^ 5 is a constant expression

int b = 10;
int aa[b];
    // ^   b is a variable. So, it's value can differ at some other point.

const int size = 5;
int aaa[size];  // size is constant.

answered Sep 5, 2011 at 4:05

Mahesh's user avatar

MaheshMahesh

34.4k20 gold badges88 silver badges115 bronze badges

5

Flurry

0 / 0 / 0

Регистрация: 25.12.2012

Сообщений: 9

1

26.12.2012, 14:56. Показов 10772. Ответов 7

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

C++
1
2
3
4
5
6
7
    int a;
 
    cout << "Inter number ";
    cin >> a;
 
    const int size = a / 2;
    const int ar[size];

error C2057: требуется константное выражение (7-ая строчка)
Но ведь size — это константа. Почему не компилится?



0



3254 / 2056 / 351

Регистрация: 24.11.2012

Сообщений: 4,909

26.12.2012, 15:05

2

Все равно значение size может быть вычислено только во время выполнения.



1



Мой лучший друг-отладчик!

167 / 167 / 30

Регистрация: 24.06.2012

Сообщений: 662

Записей в блоге: 5

26.12.2012, 15:48

3

компилятор должен знать размер массива во время компиляции, а не во времы выполнения



1



Обитатель форума

201 / 184 / 54

Регистрация: 28.10.2012

Сообщений: 543

26.12.2012, 15:52

4

в этом случае поможет только динамический массив. int *arr = new int [size];



1



Flurry

0 / 0 / 0

Регистрация: 25.12.2012

Сообщений: 9

26.12.2012, 16:10

 [ТС]

5

Цитата
Сообщение от ZaMaZaN4iK
Посмотреть сообщение

компилятор должен знать размер массива во время компиляции, а не во времы выполнения

вот так тоже не получается.

C++
1
2
    int size = 100;
    int ar[size];

хотя размер массива уже известен во время компиляции

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



0



Обитатель форума

201 / 184 / 54

Регистрация: 28.10.2012

Сообщений: 543

26.12.2012, 16:10

6

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



0



Avazart

Эксперт С++

8385 / 6147 / 615

Регистрация: 10.12.2010

Сообщений: 28,683

Записей в блоге: 30

26.12.2012, 16:13

7

C++
1
2
const int size = 100;
int ar[size];



0



Неэпический

17819 / 10592 / 2044

Регистрация: 27.09.2012

Сообщений: 26,636

Записей в блоге: 1

26.12.2012, 16:14

8

Цитата
Сообщение от Afflicted
Посмотреть сообщение

в этом случае поможет только динамический массив. int *arr = new int [size];

либо VLA GNU



0



    msm.ru

    Нравится ресурс?

    Помоги проекту!

    >
    Определение параметров массивов в языке С

    • Подписаться на тему
    • Сообщить другу
    • Скачать/распечатать тему

      


    Сообщ.
    #1

    ,
    24.12.11, 13:33

      1. В книге Харбисона и Стила «Язык С с примерами» (2011 года, стр. 162) указывается, что запись функции вида:
      void getArray(int nstr, int ncol, int a[nstr][ncol]) {…}
      является корректным. Я не очень понял, как тогда нужно объявлять массив «a» в основной программе для правильного вызова функции.
      2. В книге по C, по-моему, Шилда указано, что в функциях можно использовать локальные массивы конструкции:

      ExpandedWrap disabled

        void getArray(int nstr, int ncol)

        {

        int a[nstr][ncol];

        }

      Ошибки

      ExpandedWrap disabled

        error C2057: требуется константное выражение

        error C2466: невозможно выделить память для массива постоянного нулевого размера

        error C2057: требуется константное выражение

        error C2466: невозможно выделить память для массива постоянного нулевого размера

        error C2087: a: отсутствует индекс

      Может быть я неправильно понял изложенное в этих книгах? Прикрепляю проект, который компилировал и как С++, и как С. Посмотрите, пожалуйста, может быть я что-то делаю неправильно.

      Прикреплённый файлПрикреплённый файлMy_ConsConly.zip (2,21 Кбайт, скачиваний: 96)

      Сообщение отредактировано: tumanovalex — 24.12.11, 13:35


      Adil



      Сообщ.
      #2

      ,
      24.12.11, 14:05

        Цитата tumanovalex @ 24.12.11, 13:33

        2. В книге по C, по-моему, Шилда указано, что в функциях можно использовать локальные массивы конструкции:

        Или ты не так понял, или выкинь книгу. При объявлении массива nrow и ncol должны быть константами.

        Guru

        Qraizer



        Сообщ.
        #3

        ,
        24.12.11, 16:20

          Moderator

          *******

          Рейтинг (т): 521

          В Стандарте C99 разрешаются локальные в функциях массивы с неконстанстными размерами. В Стандарте C++ такого нет за ненадобностью. Но по-любому массивы в параметрах функций сводятся к указателям. Оно является коррекным в любой ревизии C/C++, но будет игнорироваться.


          D_KEY
          Online



          Сообщ.
          #4

          ,
          24.12.11, 17:20

            Цитата Adil @ 24.12.11, 14:05

            Цитата tumanovalex @ 24.12.11, 13:33

            2. В книге по C, по-моему, Шилда указано, что в функциях можно использовать локальные массивы конструкции:

            Или ты не так понял, или выкинь книгу. При объявлении массива nrow и ncol должны быть константами.

            В С++. В С — можно и не константами(в C99).
            Кстати, новый же стандарт C++ хотели привести в соответствие с C99 :-?


            amk



            Сообщ.
            #5

            ,
            25.12.11, 17:49

              Цитата D_KEY @ 24.12.11, 17:20

              Кстати, новый же стандарт C++ хотели привести в соответствие с C99

              C99 так и не стал основным стандартом C. Все еще существуют компиляторы не поддерживаюшие этот стандарт, и это считается нормальным.

              Учитывая, что в C++ и массивы C89 с константным размером считаются плохим тоном, то становится понятным, почему в стандарт C++ не стали вводить массивы с неизвестным на момент компиляции размером. Тем более, что у C99 и C++ и так хватает несоответствий. Вдобавок подобная таким массивам конструкция, реализованная средствами C++, практически не отличается результатом компиляции.


              MyNameIsIgor



              Сообщ.
              #6

              ,
              25.12.11, 22:27

                Цитата amk @ 25.12.11, 17:49

                C99 так и не стал основным стандартом C

                А уже вышел C11…


                D_KEY
                Online



                Сообщ.
                #7

                ,
                26.12.11, 06:43

                  Цитата amk @ 25.12.11, 17:49

                  Вдобавок подобная таким массивам конструкция, реализованная средствами C++, практически не отличается результатом компиляции.

                  Это какая же? Разве что извращаться через placement new.

                  Guru

                  Qraizer



                  Сообщ.
                  #8

                  ,
                  26.12.11, 08:12

                    Moderator

                    *******

                    Рейтинг (т): 521

                    Зачем? std::vector<> на что?


                    D_KEY
                    Online



                    Сообщ.
                    #9

                    ,
                    26.12.11, 08:37

                      Цитата Qraizer @ 26.12.11, 08:12

                      Зачем? std::vector<> на что?

                      std::vector<> работает с динамической памятью. Можно, конечно, заставить его работать со стэком, но это уже извращение. ИМХО.

                      Сообщение отредактировано: D_KEY — 26.12.11, 08:38

                      Guru

                      Qraizer



                      Сообщ.
                      #10

                      ,
                      26.12.11, 08:41

                        Moderator

                        *******

                        Рейтинг (т): 521

                        Ну и что? Контракты те же.


                        D_KEY
                        Online



                        Сообщ.
                        #11

                        ,
                        26.12.11, 08:50

                          Цитата Qraizer @ 26.12.11, 08:41

                          Ну и что? Контракты те же.

                          «Контракты» даже лучше у вектора :) Тут же работа со стэком и ключевая особенность variable-length массивов именно в этом.
                          Разговор изначально вообще-то о С был.
                          Но я так и не понял, почему в новом стандарте С++ все-таки отказались от обещанной совместимости с C99?


                          Сыроежка



                          Сообщ.
                          #12

                          ,
                          26.12.11, 19:59

                            Цитата tumanovalex @ 24.12.11, 13:33

                            1. В книге Харбисона и Стила «Язык С с примерами» (2011 года, стр. 162) указывается, что запись функции вида:
                            void getArray(int nstr, int ncol, int a[nstr][ncol]) {…}
                            является корректным. Я не очень понял, как тогда нужно объявлять массив «a» в основной программе для правильного вызова функции.
                            2. В книге по C, по-моему, Шилда указано, что в функциях можно использовать локальные массивы конструкции:

                            ExpandedWrap disabled

                              void getArray(int nstr, int ncol)

                              {

                              int a[nstr][ncol];

                              }

                            Ошибки
                            Может быть я неправильно понял изложенное в этих книгах? Прикрепляю проект, который компилировал и как С++, и как С.

                            1. В книге Харбисона и Стила «Язык С с примерами» (2011 года, стр. 162) указывается, что запись функции вида:
                            void getArray(int nstr, int ncol, int a[nstr][ncol]) {…}
                            является корректным. Я не очень понял, как тогда нужно объявлять массив «a» в основной программе для правильного вызова функции.
                            2. В книге по C, по-моему, Шилда указано, что в функциях можно использовать локальные массивы конструкции:

                            ExpandedWrap disabled

                              void getArray(int nstr, int ncol)

                              {

                              int a[nstr][ncol];

                              }

                            Ошибки
                            Может быть я неправильно понял изложенное в этих книгах? Прикрепляю проект, который компилировал и как С++, и как С.

                            Первый ваш вопрос. Для вызова функции getArray нужно в первых двух параметрах указать размеррности массива, передаваемого в качестве третьего аргумента.

                            Например,

                            ExpandedWrap disabled

                              int main( void )

                              {

                                 int a[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } };

                                 getArray( 2, 3, a );

                              }

                            Второй ваш вопрос. ваш компилятор выдает сообщения об ошибке, так как он, скорей всего, просто не поддерживает стандарт языка С99.
                            Если вы программируете на С, то вам очевидно нужно использовать компилятор, который поддерживает стандарт С99.

                            Guru

                            Qraizer



                            Сообщ.
                            #13

                            ,
                            27.12.11, 08:39

                              Moderator

                              *******

                              Рейтинг (т): 521

                              Цитата D_KEY @ 26.12.11, 08:50

                              Тут же работа со стэком и ключевая особенность variable-length массивов именно в этом.

                              Да ну? А я всегда считал, что это не цель, а средство её достижения. А целью является «локальность» выделяемой памяти. Когда-то этим занималась _alloca(), и такие массивы являются результатом её стандартизации.


                              D_KEY
                              Online



                              Сообщ.
                              #14

                              ,
                              27.12.11, 08:54

                                Цитата Qraizer @ 27.12.11, 08:39

                                Цитата D_KEY @ 26.12.11, 08:50

                                Тут же работа со стэком и ключевая особенность variable-length массивов именно в этом.

                                Да ну? А я всегда считал, что это не цель, а средство её достижения. А целью является «локальность» выделяемой памяти.

                                Я одного не понял, с чем ты спорил? Стэк == локальная память.

                                Сообщение отредактировано: D_KEY — 27.12.11, 08:55

                                Guru

                                Qraizer



                                Сообщ.
                                #15

                                ,
                                27.12.11, 09:32

                                  Moderator

                                  *******

                                  Рейтинг (т): 521

                                  С тем, что std::vector<> якобы не является заменой. Является. Поэтому эта C99-фича в Плюсах не нужна.

                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                                  0 пользователей:

                                  • Предыдущая тема
                                  • C/C++: Общие вопросы
                                  • Следующая тема

                                  Рейтинг@Mail.ru

                                  [ Script execution time: 0,0755 ]   [ 18 queries used ]   [ Generated: 24.06.23, 08:51 GMT ]  

                                  Doing some AudioDSP in VC++ 2012 and am having problems with allocating memory for the buffer

                                  int size = input.getSize();
                                  float buf[size];
                                  

                                  At compile I get the error «error C2057: expected constant expression» Looks like the code works in C99 just not C++. Any idea how to get around this?

                                  Morwenn's user avatar

                                  Morwenn

                                  21.6k11 gold badges92 silver badges152 bronze badges

                                  asked Jun 12, 2013 at 9:52

                                  user2477744's user avatar

                                  That is because C99 supports variable length arrays, whilst C++ does not (at least, not C++98, nor C++11). Here are some workarounds:

                                  • Refactor your code to use a std::vector or any suitable container. If possible, this would be the preferred method.

                                  • Find a compiler that supports VLAs as an extension (for example, GCC with the option -std=c++gnu98 or -std=gnu++11).

                                  Anyway, if you don’t have that much code to refactor, please try to change your code to use a standard container instead of a VLA.

                                  answered Jun 12, 2013 at 12:43

                                  Morwenn's user avatar

                                  MorwennMorwenn

                                  21.6k11 gold badges92 silver badges152 bronze badges

                                • Ошибка c2011 переопределение типа class
                                • Ошибка c2011 timespec переопределение типа struct
                                • Ошибка c200d mazda 6 gh
                                • Ошибка c2002 фрилендер 2
                                • Ошибка c2000 kyocera 2035