2010-06-21 15 views

Respuesta

71

Supongo que está utilizando un compilador C99 (con soporte para matrices de tamaño dinámico). El problema en su código es que en el momento en que los compiladores ven su declaración de variables no puede saber cuántos elementos hay en la matriz (también estoy asumiendo aquí, del error del compilador que length no es una constante de tiempo de compilación).

Debe inicializar manualmente esa matriz:

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

Puedo utilizar también para este propósito malloc, ¿qué pasa con la segunda pregunta, la escribí después de la respuesta de Pavel – helloWorld

+0

@helloWorld: con matrices asignadas a la pila, 'printf ("% d ", boardAux [1] [2])' compila multa. El compilador conoce los tamaños y sabe en qué posición de la memoria está el elemento (1,2). Si usa la asignación dinámica, la matriz es unidimensional y debe realizar las operaciones matemáticas usted mismo: 'printf ("% d ", boardAux [1 * length + 2])' –

+0

@AndreyT: Gracias por señalar el error en el 'memset 'llamar. Lo acabo de corregir. –

-5

No puede hacerlo. El compilador de C no puede hacer una cosa tan compleja en la pila.

Tiene que usar el montón y la asignación dinámica.

Lo que realmente necesita hacer:

  • tamaño de cómputo (n m sizeof (elemento)) de la memoria que necesita
  • malloc
  • llamada (tamaño) para asignar la memoria
  • crear un descriptor de acceso: int * access (ptr, x, y, rowSize) {return ptr + y * rowSize + x; }

Use * access (boardAux, x, y, size) = 42 para interactuar con la matriz.

+0

una pregunta más, ¿por qué recibo un uso no válido de error de matriz con los límites especificados? printf ("% d", placa [i] [j]); – helloWorld

+7

-1 C99 permite la asignación dinámica en la pila como el código de usuario (excluyendo la inicialización). No es necesario realizar asignaciones dinámicas. –

+0

@helloWorld porque las dimensiones del conjunto deben conocerse. –

17

Recibe este error porque en lenguaje C que no está permitido el uso de inicializadores con matrices de longitud variable. El mensaje de error que está recibiendo básicamente lo dice todo.

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

¿Dónde encontraste esto? ¿Puedes darme un enlace? – helloWorld

+1

@helloWorld: Esto es del estándar de lenguaje (C99). Puede obtener una copia de "trabajo" con las actualizaciones de TC3 aquí http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf – AnT

+3

Hay temas por los cuales algunos siempre le fallarán si solo proporcione la explicación informal. Los arreglos de longitud variable son uno de estos temas. +1 para cotizar el estándar. –

6

Esto da error:

int len; 
scanf("%d",&len); 
char str[len]=""; 

Esto también da error:

int len=5; 
char str[len]=""; 

Pero esto funciona bien:

int len=5; 
char str[len]; //so the problem lies with assignment not declaration 

Es necesario poner valor en el siguiente manera:

str[0]='a'; 
str[1]='b'; //like that; and not like str="ab"; 
0

Simplemente declarar la longitud de ser una cons, si no es la memoria, entonces debería estar asignando dinámicamente

+2

¡Creo que debes buscar qué significa const! – Holger

1

Después de declarar la matriz

int boardAux[length][length]; 

la forma más sencilla para asignar los valores iniciales como cero está utilizando para bucle, incluso si puede ser un poco largo

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

Para C++ declaración separada e inicialización como t su ..

int a[n][m] ; 
a[n][m]= {0}; 
Cuestiones relacionadas