2010-06-21 32 views

risposta

71

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)); 
+0

Posso usare anche per questo malloc, per quanto riguarda la seconda domanda, l'ho scritta dopo la risposta di Pavel – helloWorld

+0

@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])' –

+0

@AndreyT: Grazie per aver segnalato l'errore nel 'memset 'chiama. L'ho appena corretto. –

-5

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:

  • dimensioni calcolo (n m sizeof (elemento)) della memoria è necessario
  • chiamata malloc (dimensione) per allocare la memoria
  • creare un accessor: int * access (ptr, x, y, rowSize) {return ptr + y * rowSize + x; }

Utilizzare * access (boardAux, x, y, size) = 42 per interagire con la matrice.

+0

un'altra domanda, perché ricevo un errore uso non valido dell'array con limiti non specificati? printf ("% d", scheda [i] [j]); – helloWorld

+7

-1 C99 consente l'allocazione dinamica nello stack come codice utente (esclusa l'inizializzazione). Non è necessario eseguire allocazioni dinamiche. –

+0

@helloWorld perché le dimensioni degli array devono essere note. –

17

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.

+0

dove hai trovato questo, puoi darmi un link? – helloWorld

+1

@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

+3

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. –

6

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"; 
0

Semplicemente dichiarare lunghezza per essere un contro, se non è allora si dovrebbe allocare memoria dinamicamente

+2

Penso che tu abbia bisogno di cercare cosa significa const! – Holger

1

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; 
} 
1

Per C++ dichiarazione separata e inizializzazione come t il suo ..

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