Perché ricevo l'errore "Impossibile inizializzare l'oggetto di dimensioni variabili" con il codice seguente?
int boardAux[length][length] = {{0}};
enum {length = 0xF } ; int boardAux[length][length] = {0};
Perché ricevo l'errore "Impossibile inizializzare l'oggetto di dimensioni variabili" con il codice seguente?
int boardAux[length][length] = {{0}};
enum {length = 0xF } ; int boardAux[length][length] = {0};
Risposte:
Presumo che tu stia utilizzando un compilatore C99 (con supporto per array di dimensioni dinamiche). Il problema nel tuo codice è che nel momento in cui i compilatori vedono la tua dichiarazione di variabile non possono sapere quanti elementi ci sono nell'array (presumo anche qui, dall'errore del compilatore che length
non è una costante del tempo di compilazione).
È necessario inizializzare manualmente quell'array:
int boardAux[length][length];
memset( boardAux, 0, length*length*sizeof(int) );
printf( "%d", boardAux[1][2] )
compila bene. Il compilatore conosce le dimensioni e sa in quale posizione in memoria si trova il (1,2) -esimo elemento. Se utilizzi l'allocazione dinamica, l'array è unidimensionale e devi eseguire i calcoli da solo:printf("%d", boardAux[ 1*length + 2 ])
memset
chiamata. L'ho appena corretto.
length
su essere static
? In C ++ 14 funziona bene.
Viene visualizzato questo errore perché in linguaggio C non è consentito utilizzare inizializzatori con array di lunghezza variabile. Il messaggio di errore che stai ricevendo dice praticamente tutto.
6.7.8 Inizializzazione
...
3 Il tipo di entità da inizializzare deve essere un array di dimensioni sconosciute o un tipo di oggetto che non è un tipo di array di lunghezza variabile.
Questo dà errore:
int len;
scanf("%d",&len);
char str[len]="";
Questo dà anche errore:
int len=5;
char str[len]="";
Ma funziona bene:
int len=5;
char str[len]; //so the problem lies with assignment not declaration
Devi dare valore nel modo seguente:
str[0]='a';
str[1]='b'; //like that; and not like str="ab";
Dopo aver dichiarato l'array
int boardAux[length][length];
il modo più semplice per assegnare i valori iniziali come zero è usare il ciclo for, anche se potrebbe essere un po 'lungo
int i, j;
for (i = 0; i<length; i++)
{
for (j = 0; j<length; j++)
boardAux[i][j] = 0;
}
memset
è più semplice e veloce.
La domanda ha già una risposta, ma volevo sottolineare un'altra soluzione che è veloce e funziona se la lunghezza non deve essere modificata in fase di esecuzione. Usa la macro #define prima di main () per definire la lunghezza e in main () la tua inizializzazione funzionerà:
#define length 10
int main()
{
int boardAux[length][length] = {{0}};
}
Le macro vengono eseguite prima della compilazione effettiva e la lunghezza sarà una costante del tempo di compilazione (come indicato da David Rodríguez nella sua risposta). Sostituirà effettivamente la lunghezza con 10 prima della compilazione.
Dichiara semplicemente che la lunghezza è un contro, se non lo è dovresti allocare la memoria in modo dinamico
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;
}
Per la dichiarazione separata C ++ e l'inizializzazione come questa ..
int a[n][m] ;
a[n][m]= {0};
Non puoi farlo. Il compilatore C non può fare una cosa così complessa sullo stack.
Devi usare l'heap e l'allocazione dinamica.
Cosa devi veramente fare:
Usa * access (boardAux, x, y, size) = 42 per interagire con la matrice.