array variabilmente modificato nell’ambito del file in C

Ho un codice come questo:

static int a = 6; static int b = 3; static int Hello[a][b] = { { 1,2,3}, { 1,2,3}, { 1,2,3}, { 1,2,3}, { 1,2,3}, { 1,2,3} }; 

ma quando lo compilo, dice errore:

‘Ciao’ variabilmente modificato nell’ambito del file

Come è potuto accadere? e come posso ripararlo?

Non è ansible avere un array statico di cui viene data la dimensione come variabile

Ecco perché le costanti dovrebbero essere #define d:

 #define a 6 

In questo modo il preprocessore sostituirà a con 6 , rendendolo una dichiarazione valida.

variable modified array at file scope is not possible risposta semplice variable modified array at file scope is not possible .

Dettagliato:

falla compilare l’ integral constant expression tempo, poiché la lunghezza dell’array deve essere specificata al momento della compilazione.

come questo :

 #define a 6 #define b 3 

Oppure, seguire lo standard C99. e compilare come per gcc.

gcc -Wall -std=c99 test.c -o test.out

Il problema qui è un array di lunghezza variabile con lunghezza di fornitura non può essere inizializzato in modo da ottenere questo errore.

semplicemente

 static int a =6; static int b =3; void any_func() { int Hello [a][b]; // no need of initialization no static array means no file scope. } 

Ora usa il ciclo o qualsiasi loop per riempire l’array.

Per maggiori informazioni basta una DEMO:

 #include  static int a = 6; int main() { int Hello[a]={1,2,3,4,5,6}; // see here initialization of array Hello it's in function //scope but still error return 0; } [email protected]:~/c# clang -std=c99 vararr.c -o vararr vararr.c:8:11: error: variable-sized object may not be initialized int Hello[a]={1,2,3,4,5,6}; ^ 1 error generated. 

Se rimuovi la statica e fornisci l’inizializzazione, genererà un errore come sopra.

Ma se manterrai statico e inizializzato, l’errore sarà comunque.

Ma se rimuovi l’inizializzazione e mantieni la posizione static verrà visualizzato l’errore seguente.

 error: variable length array declaration not allowed at file scope static int Hello[a]; ^ ~ 1 error generated. 

Pertanto, la dichiarazione della matrice di lunghezza variabile non è consentita per l’ambito del file, quindi rendila funzione o ambito di blocco all’interno di qualsiasi funzione (ma ricorda che è necessario rimuoverla dall’ambito dell’inizializzazione della funzione)

NOTA: Poiché è codificato in C , fare in modo che a e b come const non ti aiutino, ma in C++ const funzionerà correttamente.

Quando si usa CLANG / LLVM i seguenti lavori:

 static const int a = 6; static const int b = 3; static int Hello[a][b] = { { 1,2,3}, { 1,2,3}, { 1,2,3}, { 1,2,3}, { 1,2,3}, { 1,2,3} }; 

(Per vederlo nell’assemblaggio generato, è necessario utilizzare Hello in modo che non venga ottimizzato)

Tuttavia, questo genererà un errore se è selezionata la modalità C99 (-std = c99), genererà solo un avviso (costante di piegatura di Wgnu) se è selezionato -pedantic.

GCC non sembra consentirlo (const è interpretato come di sola lettura)

Vedi la spiegazione in questo thread:

Errore “Initializer element is not constant” senza motivo in GCC Linux, compilando C