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
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
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
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
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
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
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 Метки нет (Все метки)
error C2057: требуется константное выражение (7-ая строчка)
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 |
|||
компилятор должен знать размер массива во время компиляции, а не во времы выполнения вот так тоже не получается.
хотя размер массива уже известен во время компиляции Добавлено через 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 |
|||
0 |
Неэпический 17819 / 10592 / 2044 Регистрация: 27.09.2012 Сообщений: 26,636 Записей в блоге: 1 |
|
26.12.2012, 16:14 |
8 |
в этом случае поможет только динамический массив. int *arr = new int [size]; либо VLA GNU
0 |
|
|
|
Определение параметров массивов в языке С
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
1. В книге Харбисона и Стила «Язык С с примерами» (2011 года, стр. 162) указывается, что запись функции вида: void getArray(int nstr, int ncol) { int a[nstr][ncol]; } Ошибки error C2057: требуется константное выражение error C2466: невозможно выделить память для массива постоянного нулевого размера error C2057: требуется константное выражение error C2466: невозможно выделить память для массива постоянного нулевого размера error C2087: a: отсутствует индекс Может быть я неправильно понял изложенное в этих книгах? Прикрепляю проект, который компилировал и как С++, и как С. Посмотрите, пожалуйста, может быть я что-то делаю неправильно. Сообщение отредактировано: tumanovalex — 24.12.11, 13:35 |
Adil |
|
Цитата tumanovalex @ 24.12.11, 13:33 2. В книге по C, по-моему, Шилда указано, что в функциях можно использовать локальные массивы конструкции: Или ты не так понял, или выкинь книгу. При объявлении массива nrow и ncol должны быть константами. |
![]() Qraizer |
|
Moderator Рейтинг (т): 521 |
В Стандарте C99 разрешаются локальные в функциях массивы с неконстанстными размерами. В Стандарте C++ такого нет за ненадобностью. Но по-любому массивы в параметрах функций сводятся к указателям. Оно является коррекным в любой ревизии C/C++, но будет игнорироваться. |
D_KEYOnline |
|
Цитата Adil @ 24.12.11, 14:05 Цитата tumanovalex @ 24.12.11, 13:33 2. В книге по C, по-моему, Шилда указано, что в функциях можно использовать локальные массивы конструкции: Или ты не так понял, или выкинь книгу. При объявлении массива nrow и ncol должны быть константами.
В С++. В С — можно и не константами(в C99). |
amk |
|
Цитата D_KEY @ 24.12.11, 17:20 Кстати, новый же стандарт C++ хотели привести в соответствие с C99 C99 так и не стал основным стандартом C. Все еще существуют компиляторы не поддерживаюшие этот стандарт, и это считается нормальным. Учитывая, что в C++ и массивы C89 с константным размером считаются плохим тоном, то становится понятным, почему в стандарт C++ не стали вводить массивы с неизвестным на момент компиляции размером. Тем более, что у C99 и C++ и так хватает несоответствий. Вдобавок подобная таким массивам конструкция, реализованная средствами C++, практически не отличается результатом компиляции. |
MyNameIsIgor |
|
Цитата amk @ 25.12.11, 17:49 C99 так и не стал основным стандартом C А уже вышел C11… |
D_KEYOnline |
|
Цитата amk @ 25.12.11, 17:49 Вдобавок подобная таким массивам конструкция, реализованная средствами C++, практически не отличается результатом компиляции. Это какая же? Разве что извращаться через placement new. |
![]() Qraizer |
|
Moderator Рейтинг (т): 521 |
Зачем? std::vector<> на что? |
D_KEYOnline |
|
Цитата Qraizer @ 26.12.11, 08:12 Зачем? std::vector<> на что? std::vector<> работает с динамической памятью. Можно, конечно, заставить его работать со стэком, но это уже извращение. ИМХО. Сообщение отредактировано: D_KEY — 26.12.11, 08:38 |
![]() Qraizer |
|
Moderator Рейтинг (т): 521 |
Ну и что? Контракты те же. |
D_KEYOnline |
|
Цитата Qraizer @ 26.12.11, 08:41 Ну и что? Контракты те же.
«Контракты» даже лучше у вектора |
Сыроежка |
|
Цитата tumanovalex @ 24.12.11, 13:33 1. В книге Харбисона и Стила «Язык С с примерами» (2011 года, стр. 162) указывается, что запись функции вида: void getArray(int nstr, int ncol) { int a[nstr][ncol]; }
Ошибки
1. В книге Харбисона и Стила «Язык С с примерами» (2011 года, стр. 162) указывается, что запись функции вида: void getArray(int nstr, int ncol) { int a[nstr][ncol]; }
Ошибки Первый ваш вопрос. Для вызова функции getArray нужно в первых двух параметрах указать размеррности массива, передаваемого в качестве третьего аргумента. Например, int main( void ) { int a[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } }; getArray( 2, 3, a ); } Второй ваш вопрос. ваш компилятор выдает сообщения об ошибке, так как он, скорей всего, просто не поддерживает стандарт языка С99. |
![]() Qraizer |
|
Moderator Рейтинг (т): 521 |
Цитата D_KEY @ 26.12.11, 08:50 Тут же работа со стэком и ключевая особенность variable-length массивов именно в этом. Да ну? А я всегда считал, что это не цель, а средство её достижения. А целью является «локальность» выделяемой памяти. Когда-то этим занималась _alloca(), и такие массивы являются результатом её стандартизации. |
D_KEYOnline |
|
Цитата Qraizer @ 27.12.11, 08:39 Цитата D_KEY @ 26.12.11, 08:50 Тут же работа со стэком и ключевая особенность variable-length массивов именно в этом. Да ну? А я всегда считал, что это не цель, а средство её достижения. А целью является «локальность» выделяемой памяти. Я одного не понял, с чем ты спорил? Стэк == локальная память. Сообщение отредактировано: D_KEY — 27.12.11, 08:55 |
![]() Qraizer |
|
Moderator Рейтинг (т): 521 |
С тем, что std::vector<> якобы не является заменой. Является. Поэтому эта C99-фича в Плюсах не нужна. |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- C/C++: Общие вопросы
- Следующая тема
[ 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
21.6k11 gold badges92 silver badges152 bronze badges
asked Jun 12, 2013 at 9:52
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
MorwennMorwenn
21.6k11 gold badges92 silver badges152 bronze badges