ответ

71

Я предполагаю, что вы используете компилятор C99 (с поддержкой массивов с динамическим размером). Проблема в вашем коде заключается в том, что в момент, когда компиляторы видят объявление переменной, он не может знать, сколько элементов в массиве (я также предполагаю здесь, из ошибки компилятора, что length не является постоянной времени компиляции).

Вы должны вручную инициализировать этот массив:

int boardAux[length][length]; 
memset(boardAux, 0, length*length*sizeof(int)); 
+0

Я могу использовать для этого также malloc, а как насчет второго вопроса, я написал его после ответа Павла – helloWorld

+0

@helloWorld: С выделенными стеками массивами 'printf ("% d ", boardAux [1] [2])' компилирует хорошо. Компилятор знает размеры и знает, в каком месте в памяти находится (1,2) -й элемент. Если вы используете динамическое распределение, массив является одномерным, и вы должны выполнить математику самостоятельно: 'printf ("% d ", boardAux [1 * length + 2])' –

+0

@AndreyT: Спасибо за указание ошибки в 'memset 'вызывать. Я только что исправил это. –

-5

Вы не можете этого сделать. Компилятор C не может делать такую ​​сложную вещь в стеке.

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

Что вам действительно нужно сделать:

  • размер вычислений (п м SizeOf (элемент)) памяти вам нужно
  • вызова таНос (размер) выделить память
  • создать accessor: int * access (ptr, x, y, rowSize) {return ptr + y * rowSize + x; }

Использование * доступ (плата Aux, x, y, размер) = 42 для взаимодействия с матрицей.

+0

еще один вопрос, почему я получаю сообщение об ошибке с недопустимым использованием массива с неопределенными границами? printf ("% d", плата [i] [j]); – helloWorld

+7

-1 C99 позволяет динамическое распределение в стеке как код пользователя (исключая инициализацию). Нет необходимости выполнять динамические распределения. –

+0

@helloWorld, потому что размеры массива должны быть известны. –

17

Вы получаете эту ошибку, потому что в языке 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.

+0

Где вы это нашли, можете ли вы дать мне ссылку? – helloWorld

+1

@helloWorld: Это языковой стандарт (C99). Вы можете получить «рабочую» копию с обновлениями TC3 здесь. Http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf – AnT

+3

Есть темы, для которых некоторые всегда будут вас не уверовать, если вы дают лишь неофициальное объяснение. Массивы переменной длины - одна из этих тем. +1 для цитирования стандарта. –

6

Это дает ошибку:

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"; 
0

Просто объявите длину, чтобы быть против, если это не так, то вы должны быть выделения памяти динамически

+2

Я думаю, вам нужно посмотреть, что означает const! – Holger

1

После объявления массиву

int boardAux[length][length]; 

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

int i, j; 
for (i = 0; i<length; i++) 
{ 
    for (j = 0; j<length; j++) 
     boardAux[i][j] = 0; 
} 
1

Для отдельной декларации и инициализации C++, например, t его ..

int a[n][m] ; 
a[n][m]= {0}; 
Смежные вопросы