Por que recebo o erro "Objeto de tamanho variável não pode ser inicializado" com o código a seguir?
int boardAux[length][length] = {{0}};
enum {length = 0xF } ; int boardAux[length][length] = {0};
Por que recebo o erro "Objeto de tamanho variável não pode ser inicializado" com o código a seguir?
int boardAux[length][length] = {{0}};
enum {length = 0xF } ; int boardAux[length][length] = {0};
Respostas:
Presumo que você esteja usando um compilador C99 (com suporte para matrizes de tamanho dinâmico). O problema em seu código é que, no momento em que os compiladores vêem sua declaração de variável, não podem saber quantos elementos existem no array (também estou assumindo aqui, a partir do erro do compilador que length
não é uma constante de tempo de compilação).
Você deve inicializar manualmente essa matriz:
int boardAux[length][length];
memset( boardAux, 0, length*length*sizeof(int) );
printf( "%d", boardAux[1][2] )
compila bem. O compilador conhece os tamanhos e em que posição na memória está o (1,2) -ésimo elemento. Se você usar a alocação dinâmica, a matriz é unidimensional e você mesmo deve fazer as contas:printf("%d", boardAux[ 1*length + 2 ])
memset
chamada. Acabei de corrigi-lo.
length
como static
? Em C ++ 14 funciona bem.
Você recebe este erro porque na linguagem C você não tem permissão para usar inicializadores com matrizes de comprimento variável. A mensagem de erro que você está recebendo diz basicamente tudo.
6.7.8 Inicialização
...
3 O tipo da entidade a ser inicializada deve obrigatoriamente ser um array de tamanho desconhecido ou um tipo de objeto que não é um tipo de array de comprimento variável.
Isso dá erro:
int len;
scanf("%d",&len);
char str[len]="";
Isso também dá erro:
int len=5;
char str[len]="";
Mas isso funciona bem:
int len=5;
char str[len]; //so the problem lies with assignment not declaration
Você precisa colocar o valor da seguinte maneira:
str[0]='a';
str[1]='b'; //like that; and not like str="ab";
Depois de declarar a matriz
int boardAux[length][length];
a maneira mais simples de atribuir os valores iniciais como zero é usando o loop for, mesmo que seja um pouco longo
int i, j;
for (i = 0; i<length; i++)
{
for (j = 0; j<length; j++)
boardAux[i][j] = 0;
}
memset
é mais simples e rápido.
A questão já foi respondida, mas eu queria apontar outra solução que é rápida e funciona se o comprimento não deve ser alterado em tempo de execução. Use a macro #define antes de main () para definir o comprimento e em main () sua inicialização funcionará:
#define length 10
int main()
{
int boardAux[length][length] = {{0}};
}
As macros são executadas antes da compilação real e a duração será uma constante de tempo de compilação (como referido por David Rodríguez em sua resposta). Na verdade, ele substituirá o comprimento por 10 antes da compilação.
Simplesmente declare o comprimento como uma desvantagem, se não for, você deve alocar memória dinamicamente
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 C ++, separe a declaração e a inicialização como esta.
int a[n][m] ;
a[n][m]= {0};
Você não pode fazer isso. O compilador C não pode fazer uma coisa tão complexa na pilha.
Você tem que usar heap e alocação dinâmica.
O que você realmente precisa fazer:
Use * access (boardAux, x, y, size) = 42 para interagir com a matriz.