web-dev-qa-db-fra.com

tableau modifié de manière variable à la portée du fichier en C

J'ai un code comme celui-ci:

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

mais quand je le compile, il dit erreur:

'Hello' variable à la portée du fichier

comment cela pourrait-il arriver? et comment pourrais-je le réparer?

28
user707549

Vous ne pouvez pas avoir de tableau statique dont la taille est donnée sous forme de variable

C'est pourquoi les constantes doivent être #defineré:

#define a 6

De cette façon, le préprocesseur remplacera a par 6, ce qui en fait une déclaration valide.

45
zch

Réponse simple variable modified array at file scope is not possible.

Détaillé:

faire compiler le temps integral constant expression, car la longueur du tableau doit être spécifiée au moment de la compilation.

comme ça :

#define a 6
#define b 3

Ou, suivez la norme c99. et compiler comme pour gcc.

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

Le problème ici est que le tableau de longueur variable ne peut pas être initialisé, donc vous obtenez cette erreur.

simplement

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

Maintenant, utilisez for loop ou n'importe quelle boucle pour remplir le tableau.

Pour plus d'informations juste une DEMO:

#include <stdio.h>
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;
}


root@Omkant:~/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. 

Si vous supprimez l'électricité statique et fournissez l'initialisation, cela générera une erreur comme ci-dessus.

Mais si vous gardez statique ainsi que l'initialisation, le reste sera une erreur.

Mais si vous supprimez l'initialisation et conservez static, l'erreur ci-dessous se produira.

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

Donc, la déclaration de tableau de longueur variable n'est pas autorisée à la portée du fichier, alors faites-la fonctionner ou bloquez la portée dans n'importe quelle fonction (mais n'oubliez pas que la portée de la fonction doit supprimer l'initialisation)

REMARQUE: étant donné qu'il est C balisé, faire en sorte que a et b en const ne vous aidera pas mais dans C++const fonctionnera bien.

9
Omkant

Lorsque vous utilisez CLANG/LLVM, les travaux suivants:

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

(Pour le voir dans l'assembly généré, il faut utiliser Hello pour qu'il ne soit pas optimisé)

Cependant, cela générera une erreur si le mode C99 est sélectionné (-std = c99), il ne générera un avertissement (Wgnu-fold-constant) que si -pedantic est sélectionné.

GCC ne semble pas autoriser cela (const est interprété en lecture seule)

Voir l'explication dans ce fil:

erreur "L'élément d'initialisation n'est pas constant" sans raison dans Linux GCC, compilation de C

1
PolarBear2015