¿Por qué recibo el error "Es posible que el objeto de tamaño variable no se inicialice" con el siguiente código?
int boardAux[length][length] = {{0}};
enum {length = 0xF } ; int boardAux[length][length] = {0};
¿Por qué recibo el error "Es posible que el objeto de tamaño variable no se inicialice" con el siguiente código?
int boardAux[length][length] = {{0}};
enum {length = 0xF } ; int boardAux[length][length] = {0};
Respuestas:
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 variable no pueden saber cuántos elementos hay en la matriz (también estoy asumiendo aquí, por el error del compilador quelength
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) );
printf( "%d", boardAux[1][2] )
compila bien. El compilador conoce los tamaños y sabe en qué posición en la memoria está el (1,2) -ésimo elemento. Si usa la asignación dinámica, la matriz es unidimensional y debe realizar las matemáticas usted mismo:printf("%d", boardAux[ 1*length + 2 ])
memset
llamada. Lo acabo de corregir.
length
to be static
? En C ++ 14 funciona bien.
Recibe este error porque en lenguaje C no se le permite utilizar inicializadores con matrices de longitud variable. El mensaje de error que está recibiendo básicamente lo dice todo.
6.7.8 Inicialización
...
3 El tipo de entidad que se va a inicializar será una matriz de tamaño desconocido o un tipo de objeto que no sea un tipo de matriz de longitud variable.
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
Necesita poner valor de la siguiente manera:
str[0]='a';
str[1]='b'; //like that; and not like str="ab";
Después de declarar la matriz
int boardAux[length][length];
La forma más sencilla de asignar los valores iniciales como cero es usar el bucle for, 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;
}
memset
es más sencillo y rápido.
La pregunta ya está respondida, pero quería señalar otra solución que es rápida y funciona si la longitud no debe cambiarse en tiempo de ejecución. Use la macro #define antes de main () para definir la longitud y en main () su inicialización funcionará:
#define length 10
int main()
{
int boardAux[length][length] = {{0}};
}
Las macros se ejecutan antes de la compilación real y la longitud será una constante de tiempo de compilación (como lo menciona David Rodríguez en su respuesta). En realidad, sustituirá la longitud por 10 antes de la compilación.
Simplemente declare que la longitud es una desventaja, si no lo es, debería asignar memoria dinámicamente
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;
}
Para una declaración e inicialización separadas de C ++ como esta.
int a[n][m] ;
a[n][m]= {0};
No puedes hacerlo. El compilador de C no puede hacer algo tan complejo en la pila.
Tienes que usar el montón y la asignación dinámica.
Lo que realmente necesitas hacer:
Utilice * access (boardAux, x, y, size) = 42 para interactuar con la matriz.