Почему я получаю сообщение об ошибке «Объект переменного размера не может быть инициализирован» с помощью следующего кода?
int boardAux[length][length] = {{0}};
Почему я получаю сообщение об ошибке «Объект переменного размера не может быть инициализирован» с помощью следующего кода?
int boardAux[length][length] = {{0}};
enum {length = 0xF } ; int boardAux[length][length] = {0};
Ответы:
Я предполагаю, что вы используете компилятор C99 (с поддержкой массивов динамического размера). Проблема в вашем коде заключается в том, что в то время, когда компиляторы видят ваше объявление переменной, он не может знать, сколько элементов находится в массиве (я также предполагаю здесь из-за ошибки компилятора, которая length
не является константой времени компиляции).
Вы должны вручную инициализировать этот массив:
int boardAux[length][length];
memset( boardAux, 0, length*length*sizeof(int) );
printf( "%d", boardAux[1][2] )
компилируется нормально. Компилятор знает размеры и знает, в какой позиции в памяти находится (1,2) -й элемент. Если вы используете динамическое распределение, массив будет одномерным, и вы должны выполнить вычисления самостоятельно:printf("%d", boardAux[ 1*length + 2 ])
memset
вызове. Я только что поправил.
length
быть static
? В C ++ 14 все работает нормально.
Вы получаете эту ошибку, потому что в языке C вам не разрешено использовать инициализаторы с массивами переменной длины. Сообщение об ошибке, которое вы получаете, говорит само за себя.
6.7.8 Инициализация
...
3 Тип инициализируемого объекта должен быть массивом неизвестного размера или типом объекта, который не является типом массива переменной длины.
Это дает ошибку:
int len;
scanf("%d",&len);
char str[len]="";
Это также дает ошибку:
int len=5;
char str[len]="";
Но это нормально работает:
int len=5;
char str[len]; //so the problem lies with assignment not declaration
Вам нужно поставить ценность следующим образом:
str[0]='a';
str[1]='b'; //like that; and not like str="ab";
После объявления массива
int boardAux[length][length];
Самый простой способ присвоить начальным значениям ноль - использовать цикл for, даже если он может быть длинноватым
int i, j;
for (i = 0; i<length; i++)
{
for (j = 0; j<length; j++)
boardAux[i][j] = 0;
}
memset
проще и быстрее.
На этот вопрос уже дан ответ, но я хотел бы указать на другое решение, которое работает быстро и работает, если длина не должна изменяться во время выполнения. Используйте макрос #define перед main (), чтобы определить длину, и в main () ваша инициализация будет работать:
#define length 10
int main()
{
int boardAux[length][length] = {{0}};
}
Макросы запускаются до фактической компиляции, и длина будет постоянной времени компиляции (как указано в ответе Дэвида Родригеса). Фактически перед компиляцией длина будет заменена на 10.
Просто объявите длину как минус, если это не так, вы должны динамически распределять память
const int lenght=5; int array[length][length] = {{0}};
не будет.
int size=5;
int ar[size ]={O};
/* This operation gives an error -
variable sized array may not be
initialised. Then just try this.
*/
int size=5,i;
int ar[size];
for(i=0;i<size;i++)
{
ar[i]=0;
}
Для C ++ отдельное объявление и инициализация вроде этого ..
int a[n][m] ;
a[n][m]= {0};
Ты не можешь сделать это. Компилятор C не может делать такие сложные вещи в стеке.
Вы должны использовать кучу и динамическое размещение.
Что вам действительно нужно делать:
Используйте * access (boardAux, x, y, size) = 42 для взаимодействия с матрицей.