Зачем мне получать ошибку «Объект переменной размера не может быть инициализирован» следующим кодом?Ошибка компиляции C: «Объект переменной величины не может быть инициализирован»
int boardAux[length][length] = {{0}};
Зачем мне получать ошибку «Объект переменной размера не может быть инициализирован» следующим кодом?Ошибка компиляции C: «Объект переменной величины не может быть инициализирован»
int boardAux[length][length] = {{0}};
Я предполагаю, что вы используете компилятор C99 (с поддержкой массивов с динамическим размером). Проблема в вашем коде заключается в том, что в момент, когда компиляторы видят объявление переменной, он не может знать, сколько элементов в массиве (я также предполагаю здесь, из ошибки компилятора, что length
не является постоянной времени компиляции).
Вы должны вручную инициализировать этот массив:
int boardAux[length][length];
memset(boardAux, 0, length*length*sizeof(int));
Вы не можете этого сделать. Компилятор C не может делать такую сложную вещь в стеке.
Вы должны использовать кучу и динамическое распределение.
Что вам действительно нужно сделать:
Использование * доступ (плата Aux, x, y, размер) = 42 для взаимодействия с матрицей.
еще один вопрос, почему я получаю сообщение об ошибке с недопустимым использованием массива с неопределенными границами? printf ("% d", плата [i] [j]); – helloWorld
-1 C99 позволяет динамическое распределение в стеке как код пользователя (исключая инициализацию). Нет необходимости выполнять динамические распределения. –
@helloWorld, потому что размеры массива должны быть известны. –
Вы получаете эту ошибку, потому что в языке C вы не можете использовать инициализаторы с массивами переменной длиной. Сообщение об ошибке, которое вы получаете, в основном говорит все.
6.7.8 Initialization
...
3 The type of the entity to be initialized shall be an array of unknown size or an object type that is not a variable length array type.
Где вы это нашли, можете ли вы дать мне ссылку? – helloWorld
@helloWorld: Это языковой стандарт (C99). Вы можете получить «рабочую» копию с обновлениями TC3 здесь. Http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf – AnT
Есть темы, для которых некоторые всегда будут вас не уверовать, если вы дают лишь неофициальное объяснение. Массивы переменной длины - одна из этих тем. +1 для цитирования стандарта. –
Это дает ошибку:
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";
Просто объявите длину, чтобы быть против, если это не так, то вы должны быть выделения памяти динамически
Я думаю, вам нужно посмотреть, что означает const! – Holger
После объявления массиву
int boardAux[length][length];
самый простой способ присвоить начальные значения как ноль используется для цикла, даже если он может быть немного длинным
int i, j;
for (i = 0; i<length; i++)
{
for (j = 0; j<length; j++)
boardAux[i][j] = 0;
}
Для отдельной декларации и инициализации C++, например, t его ..
int a[n][m] ;
a[n][m]= {0};
Я могу использовать для этого также malloc, а как насчет второго вопроса, я написал его после ответа Павла – helloWorld
@helloWorld: С выделенными стеками массивами 'printf ("% d ", boardAux [1] [2])' компилирует хорошо. Компилятор знает размеры и знает, в каком месте в памяти находится (1,2) -й элемент. Если вы используете динамическое распределение, массив является одномерным, и вы должны выполнить математику самостоятельно: 'printf ("% d ", boardAux [1 * length + 2])' –
@AndreyT: Спасибо за указание ошибки в 'memset 'вызывать. Я только что исправил это. –