Perché si riceve l'errore "L'oggetto di dimensioni variabili non può essere inizializzato" con il codice seguente?Errore di compilazione C: "L'oggetto di dimensioni variabili potrebbe non essere inizializzato"
int boardAux[length][length] = {{0}};
Perché si riceve l'errore "L'oggetto di dimensioni variabili non può essere inizializzato" con il codice seguente?Errore di compilazione C: "L'oggetto di dimensioni variabili potrebbe non essere inizializzato"
int boardAux[length][length] = {{0}};
Suppongo che si stia utilizzando un compilatore C99 (con supporto per array di dimensioni dinamiche). Il problema nel codice è che al momento in cui i compilatori vedono la dichiarazione della variabile non può sapere quanti elementi ci sono nell'array (anche io sto assumendo qui, dall'errore del compilatore che length
non è una costante di tempo di compilazione).
È necessario inizializzare manualmente tale matrice:
int boardAux[length][length];
memset(boardAux, 0, length*length*sizeof(int));
Non puoi farlo. Il compilatore C non può fare una cosa così complessa sullo stack.
È necessario utilizzare heap e allocazione dinamica.
cosa si ha realmente bisogno di fare:
Utilizzare * access (boardAux, x, y, size) = 42 per interagire con la matrice.
un'altra domanda, perché ricevo un errore uso non valido dell'array con limiti non specificati? printf ("% d", scheda [i] [j]); – helloWorld
-1 C99 consente l'allocazione dinamica nello stack come codice utente (esclusa l'inizializzazione). Non è necessario eseguire allocazioni dinamiche. –
@helloWorld perché le dimensioni degli array devono essere note. –
Si riceve questo errore perché in linguaggio C che non sono autorizzati a utilizzare inizializzatori di array di lunghezza variabile. Il messaggio di errore che ottieni sostanzialmente dice tutto.
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.
dove hai trovato questo, puoi darmi un link? – helloWorld
@helloWorld: viene dallo standard della lingua (C99). Puoi ottenere una copia "funzionante" con gli aggiornamenti TC3 qui http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf – AnT
Ci sono materie per le quali alcuni ti crederanno sempre se tu fornire solo la spiegazione informale. Gli array di lunghezza variabile sono uno di questi argomenti. +1 per quotare lo standard. –
Questo dà errore:
int len;
scanf("%d",&len);
char str[len]="";
Questo dà anche l'errore:
int len=5;
char str[len]="";
Ma questo funziona bene:
int len=5;
char str[len]; //so the problem lies with assignment not declaration
è necessario mettere il valore nella seguente modo:
str[0]='a';
str[1]='b'; //like that; and not like str="ab";
Semplicemente dichiarare lunghezza per essere un contro, se non è allora si dovrebbe allocare memoria dinamicamente
Penso che tu abbia bisogno di cercare cosa significa const! – Holger
Dopo dichiara la matrice
int boardAux[length][length];
il modo più semplice per assegnare i valori iniziali come zero sta usando per ciclo, anche se può essere un po 'lungo
int i, j;
for (i = 0; i<length; i++)
{
for (j = 0; j<length; j++)
boardAux[i][j] = 0;
}
Per C++ dichiarazione separata e inizializzazione come t il suo ..
int a[n][m] ;
a[n][m]= {0};
Posso usare anche per questo malloc, per quanto riguarda la seconda domanda, l'ho scritta dopo la risposta di Pavel – helloWorld
@helloWorld: Con gli array allocati nello stack, 'printf ("% d ", boardAux [1] [2])' compila bene. Il compilatore conosce le dimensioni e sa in quale posizione in memoria si trova l'elemento (1,2) -th. Se si utilizza l'allocazione dinamica, l'array è unidimensionale ed è necessario eseguire i calcoli manualmente: 'printf ("% d ", boardAux [1 * length + 2])' –
@AndreyT: Grazie per aver segnalato l'errore nel 'memset 'chiama. L'ho appena corretto. –