Чому я отримую помилку "Об'єкт змінного розміру не може бути ініціалізований" із наступним кодом?
int boardAux[length][length] = {{0}};
enum {length = 0xF } ; 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];
найпростіший спосіб призначити початкові значення, як нуль, використовується для циклу, навіть якщо він може бути трохи тривалим
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 перед компіляцією.
Просто оголосіть довжину як мінус, якщо її немає, то вам слід динамічно розподіляти пам'ять
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 не може зробити таку складну річ у стеці.
Ви повинні використовувати купу та динамічне розподіл.
Що вам справді потрібно зробити:
Використовуйте * доступ (boardAux, x, y, розмір) = 42 для взаємодії з матрицею.