Pourquoi est-ce que je reçois l'erreur «L'objet de taille variable ne peut pas être initialisé» avec le code suivant?
int boardAux[length][length] = {{0}};
Pourquoi est-ce que je reçois l'erreur «L'objet de taille variable ne peut pas être initialisé» avec le code suivant?
int boardAux[length][length] = {{0}};
enum {length = 0xF } ; int boardAux[length][length] = {0};
Réponses:
Je suppose que vous utilisez un compilateur C99 (avec prise en charge des tableaux de taille dynamique). Le problème dans votre code est qu'au moment où les compilateurs voient votre déclaration de variable, ils ne peuvent pas savoir combien d'éléments il y a dans le tableau (je suppose également ici, à partir de l'erreur du compilateur, que ce length
n'est pas une constante de temps de compilation).
Vous devez initialiser manuellement cette baie:
int boardAux[length][length];
memset( boardAux, 0, length*length*sizeof(int) );
printf( "%d", boardAux[1][2] )
compile correctement . Le compilateur connaît les tailles et sait à quelle position en mémoire se trouve le (1,2) -ème élément. Si vous utilisez l'allocation dynamique, le tableau est unidimensionnel et vous devez effectuer le calcul vous-même:printf("%d", boardAux[ 1*length + 2 ])
memset
appel. Je viens de le corriger.
length
comme étant static
? En C ++ 14, cela fonctionne très bien.
Vous recevez cette erreur car en langage C, vous n'êtes pas autorisé à utiliser des initialiseurs avec des tableaux de longueur variable. Le message d'erreur que vous recevez dit tout.
6.7.8 Initialisation
...
3 Le type d'entité à initialiser doit être un tableau de taille inconnue ou un type d'objet qui n'est pas un type de tableau de longueur variable.
Cela donne une erreur:
int len;
scanf("%d",&len);
char str[len]="";
Cela donne également une erreur:
int len=5;
char str[len]="";
Mais cela fonctionne bien:
int len=5;
char str[len]; //so the problem lies with assignment not declaration
Vous devez mettre de la valeur de la manière suivante:
str[0]='a';
str[1]='b'; //like that; and not like str="ab";
Après avoir déclaré le tableau
int boardAux[length][length];
la façon la plus simple d'affecter les valeurs initiales comme zéro est d'utiliser la boucle for, même si elle peut être un peu longue
int i, j;
for (i = 0; i<length; i++)
{
for (j = 0; j<length; j++)
boardAux[i][j] = 0;
}
memset
est plus simple et plus rapide.
La question est déjà répondue mais je voulais souligner une autre solution qui est rapide et fonctionne si la longueur n'est pas censée être modifiée au moment de l'exécution. Utilisez la macro #define avant main () pour définir la longueur et dans main () votre initialisation fonctionnera:
#define length 10
int main()
{
int boardAux[length][length] = {{0}};
}
Les macros sont exécutées avant la compilation réelle et la longueur sera une constante au moment de la compilation (comme indiqué par David Rodríguez dans sa réponse). Il remplacera en fait la longueur par 10 avant la compilation.
Déclarez simplement la longueur comme étant un inconvénient, si ce n'est pas le cas, vous devriez allouer de la mémoire dynamiquement
const int lenght=5; int array[length][length] = {{0}};
pas.
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;
}
Pour une déclaration et une initialisation séparées en C ++ comme ceci.
int a[n][m] ;
a[n][m]= {0};
Tu ne peux pas le faire. Le compilateur C ne peut pas faire une chose aussi complexe sur la pile.
Vous devez utiliser le tas et l'allocation dynamique.
Ce que vous devez vraiment faire:
Utilisez * access (boardAux, x, y, size) = 42 pour interagir avec la matrice.